recherche

Maison  >  Questions et réponses  >  le corps du texte

Exécutez une procédure stockée qui remplit une table temporaire, puis sélectionne dans la table temporaire

J'ai une procédure stockée qui remplit une table temporaire globale.

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

Je souhaite exécuter une procédure stockée et sélectionner les lignes ajoutées à une table temporaire.

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

Ce code ne contient aucune ligne. J'ai donc décidé de mettre la sélection dans un même aller-retour vers la base de données :

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

Cela me donne l'erreur :

PLS-00103: Encountered the symbol "SELECT"

Si je mets le SELECT dans BEGIN ... END alors j'obtiens cette erreur :

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

Comment exécuter une procédure stockée en PHP qui remplit une table temporaire puis y effectue une sélection ?

Cela fonctionne dans SQL Developer mais pas en PHP.

Utilisation :

PHP 8.1.4
Oracle 19.0.0.0.0

P粉551084295P粉551084295528 Il y a quelques jours490

répondre à tous(1)je répondrai

  • P粉432930081

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

    Le premier problème vient de la définition oci_execute() 默认提交,因此调用 POPULATETEMPTABLE 插入的任何行都会被 ON COMMIT DELETE ROWS 清除;.

    Corrigez cela en remplaçant par :

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

    Le deuxième problème lié à l'insertion d'un SELECT dans un bloc PL/SQL est qu'il s'agit d'un PL/SQL invalide. Utilisez des curseurs de référence ou des jeux de résultats implicites. Consultez la documentation OCI8 ou les Underground PHP et Oracle Manuals

    répondre
    0
  • Annulerrépondre