PHP / OCI - Es können keine Ergebnisse der Oracle-Prozedur in einer temporären Tabelle abgerufen werden

8

Ich versuche zwei Dinge mit den PHP OCI Oracle-Funktionen zu tun:

  1. Führen Sie eine Paketprozedur in einer Oracle-Datenbank aus.
  2. 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.

ZettaGeek
quelle
1
Vielleicht kann dieser Thread nützlich sein: stackoverflow.com/questions/41506335/…
Eduardo Almeida
1
Danke, dass du das weitergegeben hast, Eduardo. Werde mit meinem DBA nachprüfen und deren Feedback dazu bekommen.
ZettaGeek
2
Obwohl es sich nach einem DB-Verbindungs- oder Berechtigungsproblem anhört, sollten Sie dennoch einige Fehlerprüfungen in Ihrem Code hinzufügen. Überprüfen Sie die OCI8 manuellen Fehler Beispiele . Lesen Sie auch das Underground PHP- und Oracle-Handbuch .
Christopher Jones
2
Nicht mit der Lösung verbunden, aber dies kann nützlich sein: Sie 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.
Christopher Jones

Antworten:

1

Ist die temporäre Tabelle definiert als on commit delete rowsoder als on commit preserve rows?

Standardmäßig oci_executewird commitnach jedem erfolgreichen Anruf implizit ein ausgegeben. Angenommen, Ihre temporäre Tabelle ist so definiert on 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 übergeben

oci_execute($firstStid, OCI_DEFAULT);

Angenommen, Sie tun dies, möchten Sie jedoch eine explizite Aktion oci_commitausführen, um die von Ihnen geöffnete Transaktion zu schließen.

Justin Cave
quelle
Das hat funktioniert! Ich kann nicht glauben, dass es so einfach war. Danke Justin! :)
ZettaGeek