我有一个填充全局临时表的存储过程。
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 手册