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.