運行填充臨時表的預存程序,然後從臨時表中進行選擇
P粉551084295
P粉551084295 2023-09-09 14:20:33
0
1
470

我有一個填滿全域臨時表的預存程序。

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

P粉551084295
P粉551084295

全部回覆(1)
P粉432930081

第一個問題是因為 oci_execute() 預設提交,因此呼叫 POPULATETEMPTABLE 插入的任何行都會被 ON COMMIT DELETE ROWS 清除; 定義。

透過更改為修復此問題:

$sql = "BEGIN POPULATETEMPTABLE END;"
$stmt = oci_parse($conn, $sql);
oci_execute($stmt, OCI_NO_AUTO_COMMIT);

將 SELECT 放入 PL/SQL 區塊中的第二個問題是因為這是無效的 PL/SQL。使用參考遊標或隱式結果集。請參閱 OCI8 文件或 地下 PHP 和 Oracle 手冊

#
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板