Hol-und bulk-sammeln von REF CURSOR zurückgegeben wird eine Prozedur
Ich habe eine gespeicherte Prozedur, die eine SYS_REFCURSOR
als OUT
parameter. Die Signatur ist, zum Beispiel, wie folgt:
PROCEDURE myProc(p_someID IN INTEGER, p_cursor OUT SYS_REFCURSOR);
Rufe ich diese Prozedur von einer Funktion, wo muss ich kopieren Sie eine Spalte mit dem Namen clientID
von der p_cursor
einen Skalar geschachtelte Tabelle.
Mache ich wie folgt:
CREATE OR REPLACE FUNCTION myFunction
RETURN sys_refcursor
IS
someID INTEGER := 1234;
myCursor SYS_REFCURSOR;
TYPE t_clientID_nt IS TABLE OF NUMBER(16,0);
clientID_nt t_clientID_nt;
otherID SYS_REFCURSOR;
BEGIN
myProc (someID, myCursor);
FOR i IN myCursor
LOOP
clientID_nt.EXTEND;
clientID_nt (clientID_nt.COUNT) := i.clientID;
END LOOP;
-- Other code that opens the cursor otherID
-- based on the IDs in clientID_nt
...
...
RETURN otherID;
END;
/
Wenn ich versuche zu kompilieren dieser Funktion, die Fehler, die ich bekomme, ist:
PLS-00221: 'CLIENTID_NT' is not a procedure or is undefined
und es wird in Zeile 11 der code.
Jede Hilfe, wie zu Holen und bulk collect aus wie ein cursor wird sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht erlaubt die Verwendung von cursor-Variablen in der
for
cursor-Schleife (FOR i IN myCursor
). Sie haben zu Holen von der cursor-variable explizit eine Zeile zu einem Zeitpunkt, mitFETCH INTO
- Anweisung und die regelmäßige loop-Anweisung für die Instanz oder verwenden SieFETCH BULK COLLECT INTO
zu füllen, eine Sammlung. Zum Beispiel:myProc
Verfahren. Wenn Sie wissen, die Art und unterscheidet sich vonsome_table%rowtype
dann könnten Sie deklarieren Sie einen record-Typ, die hat so viele Felder, wie viele ref-cursor enthält, und die Felder sind kompatible Datentypen.