Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie rufe ich den Oracle-Referenz-Cursor in die Tabellenvariable?

Der Name der Variablen im obigen Code hat Sie in die Irre geführt. Ihre Variable outtable befindet sich in table Typ. Es ist nicht möglich, Datensatzdaten in das Verzeichnis der Datensätze zu holen, aber Sie können sie in den Datensatz selbst holen.

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;

Aktualisierung: Wenn Sie alle Daten für eine bessere Leistung Ihrer Anwendung abrufen möchten, müssen Sie die Anweisung BULK COLLECT verwenden:

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;

Hinweis:Der Speicherverbrauch mit der BULK-Anweisung ist viel höher als ohne.

Aber wenn Sie nur die Zeilen abrufen und verarbeiten - Zeile für Zeile - gibt es keine Notwendigkeit in BULK verwenden Sie einfach den Cursor FOR LOOP . (Frag Tom )