Der Name der Variablen im obigen Code hat Sie in die Irre geführt. Ihre Variable outtable
befindet sich in table
Typ. Es ist nicht möglich, Datensatzdaten in das Verzeichnis der Datensätze zu holen, aber Sie können sie in den Datensatz selbst holen.
DECLARE
REFCUR SYS_REFCURSOR;
TYPE RECORDTYPE IS RECORD (COL1 NUMBER, COL2 VARCHAR(100));
outtable RECORDTYPE;
BEGIN
SP_OUT_RefCur_PARAM(REFCUR);
LOOP
FETCH REFCUR INTO outtable;
EXIT WHEN REFCUR%NOTFOUND;
dbms_output.put_line(outtable.col1);
END LOOP;
CLOSE REFCUR;
END;
Aktualisierung: Wenn Sie alle Daten für eine bessere Leistung Ihrer Anwendung abrufen möchten, müssen Sie die Anweisung BULK COLLECT verwenden:
DECLARE
REFCUR SYS_REFCURSOR;
TYPE RECORDTYPE IS
RECORD (COL1 NUMBER, COL2 VARCHAR(100));
TYPE TABLETYPE IS
TABLE OF REFTABLETYPE
INDEX BY PLS_INTEGER;
outtable TABLETYPE;
BEGIN
SP_OUT_RefCur_PARAM(REFCUR);
LOOP
FETCH REFCUR INTO BULK COLLECT outtable;
EXIT WHEN outtable.COUNT = 0;
FOR indx IN 1 .. outtable.COUNT
LOOP
dbms_output.put_line(outtable(indx).col1);;
END LOOP;
END LOOP;
CLOSE REFCUR;
END;
Hinweis:Der Speicherverbrauch mit der BULK-Anweisung ist viel höher als ohne.
Aber wenn Sie nur die Zeilen abrufen und verarbeiten - Zeile für Zeile - gibt es keine Notwendigkeit in BULK
verwenden Sie einfach den Cursor FOR LOOP
. (Frag Tom
)