Nama variabel dalam kode di atas menyesatkan Anda. Variabel Anda outtable
ada di table
Tipe. Tidak mungkin mengambil data rekaman ke dalam tabel rekaman, tetapi Anda dapat mengambilnya ke dalam rekaman itu sendiri.
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;
Pembaruan: Jika Anda ingin mengambil semua data untuk kinerja yang lebih baik, aplikasi Anda perlu menggunakan pernyataan 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;
Catatan:konsumsi memori dengan pernyataan BULK jauh lebih banyak daripada tanpa.
Tetapi jika Anda hanya mengambil dan memproses baris - baris pada suatu waktu tidak perlu di BULK
pernyataan, cukup gunakan kursor FOR LOOP
. (Tanya Tom
)