Navnet på variabel i koden ovenfor vildledte dig. Din variabel outtable
er i table
type. Det er ikke muligt at hente postdata ind i tabel med poster, men du kan hente det ind i selve posten.
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;
Opdatering: Hvis du vil hente alle data for bedre ydeevne for din applikation, skal du bruge BULK COLLECT-sætning:
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;
Bemærk:Hukommelsesforbruget med BULK-sætningen er meget mere end uden.
Men hvis du bare henter og behandler rækkerne - en række ad gangen er der ingen behov i BULK
sætning, skal du blot bruge markøren FOR LOOP
. (Spørg Tom
)