Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak pobrać kursor odniesienia Oracle do zmiennej tabeli?

Nazwa zmiennej w powyższym kodzie wprowadziła Cię w błąd. Twoja zmienna outtable jest w table rodzaj. Nie można pobrać danych rekordu do tabeli rekordów, ale można je pobrać do samego rekordu.

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;

Aktualizacja: Jeśli chcesz pobrać wszystkie dane, aby uzyskać lepszą wydajność swojej aplikacji, musisz użyć instrukcji 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;

Uwaga:zużycie pamięci z instrukcją BULK jest znacznie większe niż bez.

Ale jeśli tylko pobierasz i przetwarzasz wiersze - wiersz po wierszu nie ma potrzeby w BULK oświadczenie, wystarczy użyć kursora FOR LOOP . (Zapytaj Toma )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Talend etl błąd oracle 0 wstaw wiersz

  2. W jaki sposób pola w tej unii kodów mogą mieć inną nazwę?

  3. Samozadowolenie prowadzi do:Ryzyko staje się rzeczywistością

  4. Dlaczego PHP OCI8/Oracle oci_bind_array_by_name nie działa dla mnie?

  5. 12c VARCHAR2(32767)