O nome da variável no código acima o enganou. Sua variável
outtable
está na table
modelo. Não é possível buscar dados de registro na tabela de registros, mas você pode buscá-los no próprio registro. 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;
Atualização: Se você deseja buscar todos os dados para um melhor desempenho do seu aplicativo, você precisa usar a instrução 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:o consumo de memória com a instrução BULK é muito maior do que sem.
Mas se você está apenas buscando e processando as linhas - uma linha de cada vez, não há necessidade em
BULK
instrução, basta usar o cursor FOR LOOP
. (Pergunte ao Tom
)