Името на променливата в кода по-горе ви подведе. Вашата променлива outtable
е в table
Тип. Не е възможно да извлечете данни от запис в таблица със записи, но можете да ги извлечете в самия запис.
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;
Актуализация: Ако искате да извлечете всички данни за по-добра производителност на вашето приложение, трябва да използвате командата 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;
Забележка:потреблението на памет с оператора BULK е много повече, отколкото без.
Но ако просто извличате и обработвате редовете - ред по ред, няма нужда от BULK
оператор, просто използвайте курсора FOR LOOP
. (Попитайте Том
)