Führen Sie eine gespeicherte Prozedur aus, die eine temporäre Tabelle auffüllt und dann eine Auswahl aus der temporären Tabelle ausführt
P粉551084295
P粉551084295 2023-09-09 14:20:33
0
1
468

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

P粉551084295
P粉551084295

Antworte allen(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 手册

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage