sql >> Database >  >> RDS >> Oracle

Hoe de Oracle-referentiecursor in de tabelvariabele te halen?

De naam van de variabele in bovenstaande code heeft je misleid. Uw variabele outtable staat in table type. Het is niet mogelijk om recordgegevens op te halen in de tabel met records, maar u kunt het wel in de record zelf ophalen.

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;

Bijwerken: Als u alle gegevens wilt ophalen voor betere prestaties van uw toepassing, moet u de instructie BULK COLLECT gebruiken:

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;

Opmerking:het geheugenverbruik met de BULK-opdracht is veel meer dan zonder.

Maar als u alleen de rijen ophaalt en verwerkt - rij voor rij is er geen behoefte aan BULK statement, gebruik gewoon de cursor FOR LOOP . (Vraag het Tom )



  1. Afhankelijke vervolgkeuzelijst CakePHP 3

  2. Hoe SET ROWCOUNT werkt in SQL Server

  3. Parameteriseren van bestandsnaam in MYSQL LOAD DATA INFILE

  4. Niet-superuser kan geen verbinding maken als de server geen wachtwoord vraagt ​​tijdens het gebruik van dblink