Oracle
 sql >> Database >  >> RDS >> Oracle

Come recuperare il cursore di riferimento Oracle nella variabile della tabella?

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 )