我有一個填滿全域臨時表的預存程序。
CREATE GLOBAL TEMPORARY TABLE temptable ( ... ) ON COMMIT DELETE ROWS;
我想運行預存程序,然後選擇新增到臨時表中的行。
$conn = oci_connect(...); $sql = "BEGIN POPULATETEMPTABLE END;" $stmt = oci_parse($conn, $sql); oci_execute($stmt); oci_free_statement($stmt); $sql = "SELECT ... FROM temptable"; $stmt = oci_parse($conn, $sql); oci_execute($stmt); while ($row = oci_fetch_assoc($stmt)) { ... } oci_free_statement($stmt); oci_close($conn);
該程式碼未取得任何行。所以我決定將選擇放在資料庫的同一個往返:
$conn = oci_connect(...); $sql = " BEGIN POPULATETEMPTABLE END; SELECT ... FROM temptable " $stmt = oci_parse($conn, $sql); oci_execute($stmt); while ($row = oci_fetch_assoc($stmt)) { ... } oci_free_statement($stmt); oci_close($conn);
這給了我錯誤:
PLS-00103: Encountered the symbol "SELECT"
如果我把 SELECT 放在 BEGIN ... END 內;然後我得到這個錯誤:
PLS-00428: an INTO clause is expected in this SELECT statement
如何在 PHP 中執行填滿暫存資料表的預存程序,然後從中進行選擇?
它可以在 SQL Developer 中運行,但不能在 PHP 中運行。
使用:
PHP 8.1.4 Oracle 19.0.0.0.0
第一個問題是因為
oci_execute()
預設提交,因此呼叫POPULATETEMPTABLE
插入的任何行都會被ON COMMIT DELETE ROWS 清除;
定義。透過更改為修復此問題:
將 SELECT 放入 PL/SQL 區塊中的第二個問題是因為這是無效的 PL/SQL。使用參考遊標或隱式結果集。請參閱 OCI8 文件或 地下 PHP 和 Oracle 手冊
#