Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment récupérer le curseur de référence Oracle dans la variable de table ?

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 )