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
Le premier problème vient de la définition
oci_execute()
默认提交,因此调用POPULATETEMPTABLE
插入的任何行都会被ON COMMIT DELETE ROWS 清除;
.Corrigez cela en remplaçant par :
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 lesUnderground PHP et Oracle Manuals