所以我有这个代码:
<?php
...
$query = 'DECLARE rs_tm varchar2(100); rs_vl number(10);
BEGIN TM(:param1_in, :param2_in, :param3_in, :param4_out, :param5_out);
END;';
...
$stid = oci_parse($conn, $query);
oci_bind_by_name($stid, ':param1_in', $v_instance_name);
oci_bind_by_name($stid, ':param2_in', $v_ts1);
oci_bind_by_name($stid, ':param3_in', $v_ts2);
oci_bind_by_name($stid, ':param4_out', $v_result_timestamp,14);
oci_bind_by_name($stid, ':param5_out', $v_result_value,5);
oci_execute($stid);
echo "<td>".$v_result_timestamp."</td><td>".$v_result_value."</td>";
?>
它在TM程序中与以下代码配合使用很好:
CREATE OR REPLACE PROCEDURE TM(
v_ins IN varchar2,
v_t1 IN varchar2,
v_t2 IN varchar2,
res_ts OUT varchar2,
res_val OUT NUMBER
) IS
BEGIN
SELECT to_char(timestamp, 'DD.MM.YY HH24:MI'), value
INTO res_ts, res_val
FROM table1
WHERE ins = v_ins
AND timestamp BETWEEN to_timestamp(v_t1, 'DD.MM.YY HH24:MI') AND to_timestamp(v_t2, 'DD.MM.YY HH24:MI')
AND rownum = 1
ORDER BY timestamp;
END TM;
但问题是,我需要多行,所以现在我必须从过程中删除AND rownum = 1
,但我不知道如何调整我的php代码。如果我不对php文件做任何事情,只是更改过程,我会得到这个错误:
警告:
oci_execute()
[function.oci execute]:ORA-01422:精确提取返回的行数超过请求的行数ORA-06512:在"TM",第10行ORA-06512:在…的第1行/第36行上的tmout.php
当我尝试使用下一个代码而不是最后一行时(echo):
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
foreach ($row as $item) {
echo "<td>".$v_rs_tm."</td><td>".$v_rs_vl."</td>";
}
}
我得到:
警告:
oci_fetch_array()
[function.oci fetch array]:ORA-24374:在fetch之前未定义,或者在中执行和fetch。。。第38行的tmout.php。
这可能是糟糕的语法,但问题是——我不知道正确的语法。
知道吗?提前感谢
感谢Passerby,我们找到了解决方案。
在我的情况下,我并不真的需要使用过程,所以我用查询替换了它。
我用print_r发现,$row数组看起来像([TM]=>…,[VL]=>…)
结果代码在这里:
$query = "SELECT to_char(timestamp, 'DD.MM.YY HH24:MI') TM, value VL FROM transmaster WHERE instance_name = :param1 AND timestamp BETWEEN to_timestamp(:param2, 'DD.MM.YY HH24:MI') AND to_timestamp(:param3, 'DD.MM.YY HH24:MI') ORDER BY timestamp";
...
$stid = oci_parse($conn, $query);
oci_bind_by_name($stid, ':param1', $v_instance_name);
oci_bind_by_name($stid, ':param2', $v_ts1);
oci_bind_by_name($stid, ':param3', $v_ts2);
oci_execute($stid);
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo '<tr><td>'.($row['TM']).'</td><td>'.($row['VL']).'</tr>';
}