PL/SQL - execute immediate in Pipelining-Funktion
Möchte ich ausführen dynamische Abfrage in meinem Pipelining-Funktion und die Rückgabe der Ergebnisse dieser Abfrage.
Ist es möglich, dies zu tun?
Pipelining Funktion ist bequem für mich zu erreichen, gutes interface für meine Anwendung zu verursachen, es verhält sich wie eine Tabelle.
Funktion:
CREATE OR REPLACE FUNCTION MyFunction(p_schema VARCHAR2) RETURN MyTableType Pipelined IS
v_query VARCHAR2(1000);
BEGIN
v_query := 'SELECT * FROM TABLE ('||p_schema||'.somepackage.SomeFunction)'; --SomeFunction is another pipelined function
EXECUTE IMMEDIATE v_query;
--Results of the v_query are compatible with MyTableType's row type. But how to return them from pipelined function?
END;
InformationsquelleAutor dzb | 2012-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist möglich, kombinieren Sie dynamische SQL-und Pipelining-Funktion, aber der Rückgabetyp wird nicht dynamisch sein: die Anzahl und Art der Spalten, die zurückgegeben werden, werden behoben.
Können Sie
EXECUTE IMMEDIATE
mitBULK COLLECT
(Dank @hier jetzt), dynamische Cursor oderDBMS_SQL
um mehr als eine Zeile zurückgegeben. Hier ist ein Beispiel mit einem dynamischen cursor:Nennen wir diese dynamische Funktion:
Wie immer mit dynamischen SQL, hüten Sie sich vor SQL-Injection.
Vielen Dank für dieses Beispiel. Es funktioniert, aber schrecklich langsam. Ich denke, es ist Ursache ich nenne ein weiteres Pipeline-Funktion in meiner Abfrage (ich aktualisierte meine Frage) und wie es aussieht ist es zu oft aufgerufen. Konnte Sie nach ein paar Anregung zu dbms_sql?
sofort ... bulk collect into..."; for i in col.erste .. col.Letzte loop pipe row () end loop; ?
Sind die original-Pipeline-Funktionen schneller als die wrapper-Funktion?
Du hast Recht, mein schlechtes. Aus irgendeinem Grund dachte ich Sie nicht nutzen konnte
BULK COLLECT
mit einer Tabelle von%ROWTYPE
. Aber nicht nur, dass es funktioniert, wird es schneller sein, für kleine Mengen 🙂InformationsquelleAutor Vincent Malgrat
Ich denke, so etwas wie dieses:
Funktioniert nur, wenn v_query liefert 1 Zeile.
InformationsquelleAutor Rene
Konnte ich nicht, @VincentMalgrat Antwort zu arbeiten. Aber es war sehr nah. Auf jeden Fall eine große Hilfe in die richtige Richtung für mich.
Hier ist, was ich habe zu arbeiten:
Paket
Paket Körper
InformationsquelleAutor EdHayes3