Ich versuche zwei Dinge mit den PHP OCI Oracle-Funktionen zu tun:
- Führen Sie eine Paketprozedur in einer Oracle-Datenbank aus.
- Fragen Sie nach der Ausführung des Pakets eine temporäre Tabelle ab, um die Ergebnisse der Prozeduroperation zu erhalten.
Ich kann dies erfolgreich mit der von Oracle bereitgestellten SQL Developer-Software tun. Meine Anfrage ist sehr einfach und kann unten gesehen werden:
BEGIN
PKG_KTY_SEARCH.PR_PRICE_LIST();
END;
/
SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP;
Dieser Code funktioniert einwandfrei und ich erhalte eine vollständige Ergebnistabelle in SQL Developer.
Ich versuche, dasselbe oben in PHP mit OCI zu tun. Mein Code ist unten zu sehen:
<?php
// Load up the system.
require('../../system/init.php');
global $config;
$oracleDb = oci_new_connect($config['oracleDb']['username'], $config['oracleDb']['password'], $config['oracleDb']['connectionString']);
$firstStid = oci_parse($oracleDb, "BEGIN PKG_KTY_SEARCH.PR_PRICE_LIST(); END;");
oci_execute($firstStid);
$secondStid = oci_parse($oracleDb, "SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP");
oci_execute($secondStid);
oci_fetch_all($secondStid, $result);
echo json_encode($result);
echo "<br />Import complete!";
?>
Dies gibt jedoch keine Fehler und eine leere Ergebnismenge zurück. Ich kann nicht herausfinden warum. Hat hier jemand etwas Offensichtliches gesehen, das ich vermisse?
Ergebnismenge von PHP zurückgegeben
{"PRODUCT_ID":[],"CUST_ROLE":[],"MIN_QTY":[],"MAX_QTY":[],"PRICE":[]}
Meine Verbindungszeichenfolge lautet wie folgt:
$config['oracleDb']['connectionString'] = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " . $config['oracleDb']['host'] . ")(PORT = " . $config['oracleDb']['port'] . ")))(CONNECT_DATA=(SID=" . $config['oracleDb']['sid'] . ")))";
Ich verwende PHP7.1.22 und Oracle 11g Datenbank. Ich bin in der Lage, normale Tabellen abzufragen und Ergebnisse ohne Probleme in PHP zu erhalten und eine vollständige Ergebnismenge zu erhalten.
oci_execute()
tätigen zwei Anrufe, dh mindestens zwei "Roundtrips" zur DB. Aus Gründen der Leistung und Skalierbarkeit können Sie die Abfrage zum ersten anonymen Block hinzufügen und einen REF CURSOR mit den Abfrageergebnissen zurückgeben.Antworten:
Ist die temporäre Tabelle definiert als
on commit delete rows
oder alson commit preserve rows
?Standardmäßig
oci_execute
wirdcommit
nach jedem erfolgreichen Anruf implizit ein ausgegeben. Angenommen, Ihre temporäre Tabelle ist so definierton commit delete rows
, dass die Zeilen vor der nachfolgenden Abfrage gelöscht werden. Sie können dieses Verhalten ändern, indem Sie einen optionalen zweiten Parameter übergebenAngenommen, Sie tun dies, möchten Sie jedoch eine explizite Aktion
oci_commit
ausführen, um die von Ihnen geöffnete Transaktion zu schließen.quelle