Le nom de la variable dans le code ci-dessus vous a induit en erreur. Votre variable outtable
est dans table
taper. Il n'est pas possible d'extraire des données d'enregistrement dans une table d'enregistrements, mais vous pouvez les extraire dans l'enregistrement lui-même.
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;
Mise à jour : Si vous souhaitez récupérer toutes les données pour améliorer les performances de votre application, vous devez utiliser l'instruction 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;
Remarque :la consommation de mémoire avec l'instruction BULK est bien plus importante que sans.
Mais si vous ne faites que récupérer et traiter les lignes - une ligne à la fois, il n'y a pas besoin de BULK
instruction, utilisez simplement le curseur FOR LOOP
. (Demandez à Tom
)