php + oracle存储过程(多行输出)

时间:2013-12-18 10:26:07

标签: php oracle stored-procedures

所以我有这段代码:

<?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:第36行的...... / tmout.php第1行

当我尝试使用下一个代码而不是最后一行(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:在获取或执行之前定义未完成并在第38行的... tmout.php中获取。

这可能是糟糕的语法,但问题是 - 我不知道正确的。

有什么想法吗?提前致谢

1 个答案:

答案 0 :(得分:0)

感谢Passerby,找到了解决方案。

在我的情况下,我真的不需要使用过程,所以我用查询替换它。

我使用print_r查找,$ row数组看起来像([TM] =&gt; ...,[VL] =&gt; ...)

结果代码在这里:

    $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>';
    }