cari

Rumah  >  Soal Jawab  >  teks badan

Jalankan prosedur tersimpan yang mengisi jadual sementara dan kemudian memilih daripada jadual sementara

Saya mempunyai prosedur tersimpan yang mengisi jadual sementara global.

CREATE GLOBAL TEMPORARY TABLE temptable
(
...
)
ON COMMIT DELETE ROWS;

Saya mahu menjalankan prosedur tersimpan dan memilih baris yang ditambahkan pada jadual temp.

$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);

Kod ini tidak mendapat sebarang baris. Jadi saya memutuskan untuk meletakkan pemilihan dalam perjalanan pergi dan balik yang sama ke pangkalan data:

$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);

Ini memberi saya ralat:

PLS-00103: Encountered the symbol "SELECT"

Jika saya meletakkan SELECT di dalam BEGIN ... END maka saya mendapat ralat ini:

PLS-00428: an INTO clause is expected in this SELECT statement

Bagaimana untuk menjalankan prosedur tersimpan dalam PHP yang mengisi jadual sementara dan kemudian memilih daripadanya?

Ia berfungsi dalam SQL Developer tetapi tidak dalam PHP.

Gunakan:

PHP 8.1.4
Oracle 19.0.0.0.0

P粉551084295P粉551084295443 hari yang lalu460

membalas semua(1)saya akan balas

  • P粉432930081

    P粉4329300812023-09-10 12:29:41

    Masalah pertama adalah kerana definisi oci_execute() 默认提交,因此调用 POPULATETEMPTABLE 插入的任何行都会被 ON COMMIT DELETE ROWS 清除;.

    Betulkan ini dengan menukar kepada:

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

    Masalah kedua dengan meletakkan SELECT ke dalam blok PL/SQL adalah kerana ini adalah PL/SQL yang tidak sah. Gunakan kursor rujukan atau set hasil tersirat. Lihat dokumentasi OCI8 atau Underground PHP dan Oracle Manuals

    balas
    0
  • Batalbalas