erdnah Geschrieben 30. Januar 2006 Teilen Geschrieben 30. Januar 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tuxfriend Geschrieben 30. Januar 2006 Teilen Geschrieben 30. Januar 2006 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 ?.? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
erdnah Geschrieben 31. Januar 2006 Autor Teilen Geschrieben 31. Januar 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.