2013-12-18 79 views
0

所以我有這樣的代碼:PHP + Oracle存儲過程(多輸出)

<?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代碼。當我試着使用,而不是最後一行下一個代碼

Warning: oci_execute() [function.oci-execute]: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at "TM", line 10 ORA-06512: at line 1 in .../tmout.php on line 36

(回聲):如果我沒有做任何PHP文件,只是改變了程序,我收到此錯誤

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>"; 
    } 
} 

我越來越:

Warning: oci_fetch_array() [function.oci-fetch-array]: ORA-24374: define not done before fetch or execute and fetch in ...tmout.php on line 38.

那很可能是可怕的語法,但事情是 - 我不知道正確的。

有什麼想法?在此先感謝

+2

我認爲這是程序的限制,而不是php_oci。畢竟,'res_ts'是** a **值,如果它不是'rownum = 1',你會期望它是什麼? – Passerby

+0

在這種情況下,我應該使用什麼,如果不是變量輸出參數?光標並進入? – Alexander

+1

值得一試。另外,有什麼機會可以直接查詢過程中的陳述? – Passerby

回答

0

感謝路人,解決方案已被發現。

在我的情況下,我並不需要使用過程,所以我用查詢替換了它。

我使用的print_r找出來,$行陣列看起來像([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>'; 
    }