El nombre de la variable en el código anterior lo engañó. Tu variable outtable
está en table
escribe. No es posible obtener datos de registros en la tabla de registros, pero puede obtenerlos en el registro mismo.
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;
Actualización: Si desea obtener todos los datos para un mejor rendimiento de su aplicación, debe usar la instrucción 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:el consumo de memoria con la sentencia BULK es mucho mayor que sin ella.
Pero si solo está obteniendo y procesando las filas, una fila a la vez no hay necesidades en BULK
declaración, simplemente use el cursor FOR LOOP
. (Pregúntale a Tom
)