Zum Inhalt springen

CLOB als Rückgabewerte aus Oracle Stored Procedure


erdnah

Empfohlene Beiträge

Hi,

ohne PDOs würde ich gerne ein CLOB entgegennehmen, das ich als Rückgabe aus einer Stored Procedure von Oracle enthalte. Ich habe nun schon einige Stunden probiert und gesucht, aber leider kein einigermaßen ähnliches Beispiel finden können. Auch die php-Referenz hat mir nicht so recht helfen können. Hier mein Ansatz:

// $sid ist SESSION-ID, fuer die es einen User als "XML-CLOB" gibt

$stmt = oci_parse($conn, "DECLARE RetVal CLOB; P_SESSIONID VARCHAR2(200); BEGIN P_SESSIONID := '".$sid."'; RetVal := ABCSCHEMA.ABCINTERFACE.GETUSERIDBYSESSIONID ( P_SESSIONID ); END;");


// versuche "irgendwie" den "RetVal"-return als CLOB in $RetVal zu bekommen

$RetVal = oci_new_descriptor($conn, OCI_D_LOB);

oci_bind_by_name($stmt, ":RetVal", $RetVal, -1, OCI_B_CLOB);
Darauf erhalte ich die Warnung:
Warning: oci_bind_by_name() [function.oci-bind-by-name]: Error while trying to retrieve text for error ORA-01036 in ...
Im Code geht es weiter:
oci_execute($stmt);

oci_result($stmt, $RetVal);

die($RetVal);

Führt zu:

Warning: oci_result() [function.oci-result]: Invalid column index "1" in ...

Leider habe ich keinen Einfluss auf die Schnittstelle an sich.

Hoffe das mir jemand helfen kann...

Viele Grüße,

erdnah

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ohne große ahnung von PHP kann ich dir sagen, das der Fehler ORA-01036 bedeutet, dass du versucht einen Wert an eine Variable zu binden, die in deinem Statement nicht vorkommt.

Bind Variablen müssen im Statment durch die Notation :Variable kenntlich gemacht werden. Das ist in deinem oci_parse Aufruf aber nicht geschehen.

In anderen Sprachen muss man bei Bind Variablen auch kenntlich mach ob es sich um eine Input oder Output Variable handelt.

Das sind zwei Fehler die mir auffallen.

Mit Rückabewerten aus PL/SQL Code musste ich zum Glück noch nie arbeiten. Ich persönlich weiß keinen Weg, wie das funktionieren könnte. Evtl. indem du die aufgerufene Stored Procedure einen geöffneten Cursor zurückgeben lässt ?.?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi tuxfriend,

vielen Dank für Deine Mühen! Im Grunde fehlte nur der Doppelpunkt im Statement (und ein "&" für die Referenz beim oci_bind_by_name()-Aufruf).

Hier der (relevante) funktionserfüllende Code:

// XML-User holen, dazu StoredProcedure ABCSCHEMA.ABCINTERFACE.GETUSERIDBYSESSIONID(varchar2(200)) aufrufen

$stmtString = "DECLARE RetVal CLOB; P_SESSIONID VARCHAR2(200); BEGIN P_SESSIONID := '".$_GET['sid']."'; :RetVal := ABCSCHEMA.ABCINTERFACE.GETUSERIDBYSESSIONID ( P_SESSIONID ); END;";

$stmt = oci_parse($conn, $stmtString);


// CLOB bereitstellen

$RetVal = oci_new_descriptor($conn, OCI_D_LOB);


// Den Rueckgabewert der Stored Procedure (:RetVal) an $RetVal binden

oci_bind_by_name($stmt, ":RetVal", &$RetVal, -1, OCI_B_CLOB);


// Und ab!

oci_execute($stmt);


// XML-String als DOM-Objekt einlesen

$domObj = new domDocument();

$domObj->preserveWhiteSpaces = false;

$domObj->loadXML($RetVal->load());

Aus dem large Object holt man dann halt den "wahren Inhalt" mit $RetVal->load() raus... das hatte ich mir auch einfacher vorgestellt... :hells:

Grüße,

erdnah

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...