Wie wickeln Sie eine Oracle gespeicherte Prozedur in eine Funktion ausgeführt wird, indem eine standard-SELECT-Abfrage?
Ich bin Sie die folgenden Schritte, aber ich weiterhin eine Fehlermeldung erhalten, und sehen nicht das Problem:
1) Erstellen Sie eine benutzerdefinierte Oracle-Datentyp, der die Datenbank repräsentiert Spalten, die Sie abrufen möchten:
CREATE TYPE my_object AS OBJECT
(COL1 VARCHAR2(50),
COL2 VARCHAR2(50),
COL3 VARCHAR2(50));
2) Erstellen Sie einen anderen Datentyp, der eine Tabelle des Objekts, das Sie gerade erstellt haben:
TYPE MY_OBJ_TABLE AS TABLE OF my_object;
3) Erstellen Sie eine Funktion zurückgibt, die dieser Tabelle. Auch ein pipeline-Klausel, so dass die Ergebnisse sind per Pipeline zurück an die aufrufende SQL, zum Beispiel:
CREATE OR REPLACE
FUNCTION MY_FUNC (PXOBJCLASS varchar2)
RETURN MY_OBJ_TABLE pipelined IS
TYPE ref1 IS REF CURSOR
Cur1 ref1,
out_rec_my_object := my_object(null,null,null);
myObjClass VARCHAR2(50);
BEGIN
myObjClass := PXOBJCLASS
OPEN Cur1 For ‘select PYID, PXINSNAME, PZINSKEY from PC_WORK where PXOBJCLass = ;1’USING myObjClass,
LOOP
FETCH cur1 INTO out_rec.COL1, out_rec.COL2, out_rec.COL3;
EXIT WHEN Cur1%NOTFOUND;
PIPE ROW (out_rec);
END LOOP;
CLOSE Cur1;
RETURN;
END MY_FUNC;
HINWEIS: Im obigen Beispiel, können Sie leicht ersetzen Sie die select-Anweisung mit einem Aufruf auf eine andere gespeicherte Prozedur gibt eine cursor-variable.
4) In Ihrer Anwendung, rufen Sie diese Funktion als eine Tabelle-Funktion mithilfe der folgenden SQL-Anweisung:
select COL1, COL2, COL3 from TABLE(MY_FUNC('SomeSampletask'));
InformationsquelleAutor Sheraz | 2009-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Notwendigkeit zu verwenden dynamisches sql (dynamic sql ist immer ein bisschen langsamer) und es gibt zu viele Variablen deklariert. Auch die for-Schleife ist viel einfacher. Umbenannt habe ich das argument der Funktion von pxobjclass zu p_pxobjclass.
Versuchen Sie dies:
EDIT1:
Ist es übrigens schneller, um wieder eine ref-cursor, statt einen Pipelining-Funktion, die liefert eine geschachtelte Tabelle:
Dies ist schneller, da das erstellen von Objekten (my_object) einige Zeit in Anspruch nimmt.
InformationsquelleAutor tuinstoel
Sehe ich zwei Probleme:
Die dynamische Abfrage nicht so funktioniert, versuchen Sie dies:
'wählen Sie PYID, PXINSNAME, PZINSKEY von PC_WORK wo PXOBJCLass ="'||PXOBJCLASS||""
Brauchen Sie nicht myObjClass, und es scheint, alle Ihre Zitate sind falsch.
Das zitieren auf 'SomeSampletask'...
select COL1, COL2, COL3 from TABLE(MY_FUNC('SomeSampletask'));
InformationsquelleAutor Osama Al-Maadeed
Vielleicht bin ich Missverständnis etwas hier, aber es scheint, wie Sie wollen, werden Sie eine ANSICHT.
InformationsquelleAutor Paul Sonier