Il nome della variabile nel codice sopra ti ha fuorviato. La tua variabile outtable
è in table
genere. Non è possibile recuperare i dati del record nella tabella dei record, ma puoi recuperarli nel record stesso.
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;
Aggiornamento: Se desideri recuperare tutti i dati per migliorare le prestazioni della tua applicazione, devi utilizzare l'istruzione BULK COLLECT:
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;
Nota:il consumo di memoria con l'istruzione BULK è molto più che senza.
Ma se stai solo recuperando ed elaborando le righe, una riga alla volta non è necessaria in BULK
istruzione, usa semplicemente il cursore FOR LOOP
. (Chiedi a Tom
)