Tên của biến trong đoạn mã trên đã đánh lừa bạn. Biến của bạn outtable
nằm trong bảng table
loại hình. Không thể tìm nạp dữ liệu bản ghi vào bảng bản ghi, nhưng bạn có thể tìm nạp nó vào chính bản ghi.
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;
Cập nhật: Nếu bạn muốn tìm nạp tất cả dữ liệu để có hiệu suất tốt hơn ứng dụng của mình, bạn cần sử dụng câu lệnh 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;
Lưu ý:mức tiêu thụ bộ nhớ với câu lệnh BULK nhiều hơn là không có.
Nhưng nếu bạn chỉ đang tìm nạp và xử lý các hàng - một hàng tại một thời điểm thì không cần trong BULK
câu lệnh, chỉ cần sử dụng con trỏ FOR LOOP
. ( Hỏi Tom
)