上記のコードの変数の名前はあなたを誤解させました。変数outtable
table
にあります タイプ。レコードデータをレコードテーブルにフェッチすることはできませんが、レコード自体にフェッチすることはできます。
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;
更新: アプリケーションのパフォーマンスを向上させるためにすべてのデータをフェッチする場合は、BULKCOLLECTステートメントを使用する必要があります。
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;
注:BULKステートメントを使用した場合のメモリ消費量は、使用しない場合よりもはるかに多くなります。
ただし、行をフェッチして処理するだけの場合は、一度に1行ずつ、BULK
に必要はありません。 ステートメントの場合は、カーソルをFOR LOOP
で使用します。 。 (トムに質問
)