Frage

Ich versuche, eine Pipeline-Funktion zu verwenden, um auf Zeit zu sparen und Redundanz in meinen Abfragen zu reduzieren. Die Funktion in Frage kehrt Daten von einer Referenztabelle auf einer Eingabe basiert. Datensätze in der Hauptdatentabelle von Ich habe mehrere Spalten bin der Auswahl, dass alle auf die Referenztabelle beziehen. Das Problem, das ich in laufen, ist, dass wenn ich versuche, mehr die Pipeline-Funktion zu verwenden, als einmal in der Abfrage, erhalte ich eine „Cursor bereits geöffnet“ Fehler.

Zum Beispiel:

select xmlelement("genInf", xmlelement("ID", vt.ID),
                           xmlelement("vID", vt.V_ID),
                           xmlelement("vNum", vt.V_NUM),
                           xmlelement("terrDataCode", TERR_CODE.column_value), --data is based on reference table
                           xmlelement("ABValCode", AB_VAL_CD.column_value), --data is based on reference table
                           ...
from V_TAB vt, table(UTIL.fn_getOvrdValXML(vt.terr_cd_id)) TERR_CODE,
               table(UTIL.fn_getOvrdValXML(vt.ab_val_id)) AB_VAL_CD
where vt.ID = in_vID;

Das hat gut funktioniert, bis ich den zweiten Verweis auf meine Pipeline-Funktion (fn_getOvrdValXML) hinzugefügt, und ich nun den „Cursor bereits geöffnet“ Fehler.

Die Pipeline-Funktion ist sehr einfach:

type t_XMLTab is table of XMLType; --this type is in the spec
....
function fn_getOvrdValXML(in_ID in ovrd.id%type) return t_XMLTab
        pipelined is
    begin
        for r in C_OvrdVal(in_ID) loop
            pipe row(r.XMLChunk);
        end loop;
        return;
    end;

Der Cursor ist ähnlich einfach:

cursor C_OvrdVal(in_ID in ovrd.id%type) is
        select xmlforest(ID as "valueID", S_VAL as "sValue", U_VAL as "uplValue",
                          O_VAL as "oValue", O_IND as "oIndicator", F_VAL as "finalValue",
                          O_RSN as "reason") AS XMLChunk
        from ovrd_val xov;
        where xov.id = in_ID;

Gibt es eine Möglichkeit zu arbeiten, um dieses, oder sollte ich versuchen, dieses Problem zu lösen (das Problem der ovrd_val und Ausgabe eines XMLFOREST in der gleichen Art und Weise viele viele viele viele Male zu verweisen haben) anders?

Ich gebe zu, ich bin neu in Pipeline- Funktionen, damit ich nicht zu 100% bin sicher, ist dies eine angemessene Verwendung, aber es machte Sinn zu der Zeit und ich bin offen für andere Ideen;)

War es hilfreich?

Lösung

Wenn Sie Pipeline-Funktionen verwenden, dann sind Sie auf 9i Minimum, welche Mittel Sie die WITH-Klausel verwenden können:

WITH ovrdValXML AS (
  select xov.id,
         xmlforest(ID as "valueID", S_VAL as "sValue", U_VAL as "uplValue",
                        O_VAL as "oValue", O_IND as "oIndicator", F_VAL as "finalValue",
                        O_RSN as "reason") AS XMLChunk
     from ovrd_val xov)
SELECT xmlelement("genInf", xmlelement("ID", vt.ID),
                       xmlelement("vID", vt.V_ID),
                       xmlelement("vNum", vt.V_NUM),
                       xmlelement("terrDataCode", TERR_CODE.column_value), --data is based on reference table
                       xmlelement("ABValCode", AB_VAL_CD.column_value), --data is based on reference table
                       ...
  FROM V_TAB vt
  JOIN ovrdValXML terr_code ON terr_code = vt.?
                           AND terr_code.id = vt.terr_cd_id
  JOIN ovrdValXML ab_val_cd ON ab_val_cd = vt.?
                           AND ab_val_cd.id = vt.ab_val_cd
 WHERE vt.id = IN_VID;

Nicht getestet, und es ist nicht klar, was Sie Beitritt zu -. Damit die ? auf den Kriterien beitreten

Andere Tipps

Haben Sie versucht Schließen tatsächlich Ihren Cursor in dieser Pipeline-Funktion vor Reihe kochend?

OPEN C_OvrdVal(in_ID);
FETCH c_OrdVal INTO my_chunk_variable;
CLOSE C_OrdVal;
PIPE ROW my_chunk_variable;
RETURN;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top