De naam van de variabele in bovenstaande code heeft je misleid. Uw variabele outtable
staat in table
type. Het is niet mogelijk om recordgegevens op te halen in de tabel met records, maar u kunt het wel in de record zelf ophalen.
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;
Bijwerken: Als u alle gegevens wilt ophalen voor betere prestaties van uw toepassing, moet u de instructie BULK COLLECT gebruiken:
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;
Opmerking:het geheugenverbruik met de BULK-opdracht is veel meer dan zonder.
Maar als u alleen de rijen ophaalt en verwerkt - rij voor rij is er geen behoefte aan BULK
statement, gebruik gewoon de cursor FOR LOOP
. (Vraag het Tom
)