Oracle(8i以降)でSELECT結果をコレクション型変数に格納したり、FOR IN LOOPで処理する方法についての備忘録。
プログラミング言語もそうですが、短期間に様々な言語やDBを扱っていると、時々???ってなります…。
対応
BULK COLLECT INTO構文を使用する。
DECLARE
TYPE TestTblType IS TABLE OF TEST_TBL%ROWTYPE;
v_testTbl TestTblType;
BEGIN
SELECT * BULK COLLECT INTO v_testTbl FROM TEST_TBL;
FOR i IN 1 .. v_testTbl.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Row:' || v_testTbl(i).column_name);
END LOOP;
END;
上記と同等の処理をカーソルを用いて行うと以下の通り。
DECLARE
CURSOR test_tbl_cursor IS
SELECT * FROM TEST_TBL;
v_row TEST_TBL%ROWTYPE;
BEGIN
OPEN test_tbl_cursor;
LOOP
FETCH test_tbl_cursor INTO v_row;
EXIT WHEN test_tbl_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Row:' || v_row.column_name);
END LOOP;
CLOSE test_tbl_cursor;
END;
参考ウェブサイトなど
- Oracle テクノロジー:PL/SQL
BULK COLLECTとFORALLによるバルク処理(Steven Feuerstein著)
以上です。