Ich habe eine gespeicherte Prozedur, die eine globale temporäre Tabelle füllt.
CREATE GLOBAL TEMPORARY TABLE temptable ( ... ) ON COMMIT DELETE ROWS;
Ich möchte eine gespeicherte Prozedur ausführen und Zeilen auswählen, die einer temporären Tabelle hinzugefügt wurden.
$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);
Dieser Code erhält keine Zeilen. Deshalb habe ich beschlossen, die Auswahl im selben Roundtrip zur Datenbank zu übertragen:
$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);
Das gibt mir den Fehler:
PLS-00103: Encountered the symbol "SELECT"
Wenn ich SELECT in BEGIN ... END einfüge, erhalte ich diese Fehlermeldung:
PLS-00428: an INTO clause is expected in this SELECT statement
Wie führe ich eine gespeicherte Prozedur in PHP aus, die eine temporäre Tabelle füllt und dann daraus auswählt?
Es funktioniert in SQL Developer, aber nicht in PHP.
Verwendung:
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 手册