バルク時のNOTFOUNDについて
PL/SQLを書くことがあり、パフォーマンスを考慮して
バルクフェッチ、バルクインサートを使用したのですが
どうも腑に落ちないのが「NOTFOUND」です。
バルクを使用して、NOTFOUNDを使用する場合
以下のような感じでコーディングしたとします。
DECLARE
-- カーソルを定義
CURSOR cur_EMP IS SELECT * FROM EMP;
TYPE t_EMP IS TABLE OF cur_EMP%ROWTYPE;
recs_EMP t_EMP;
BEGIN
--カーソルオープン
OPEN cur_EMP
LOOP
FETCH cur_EMP BULK COLLECT INTO recs_EMP LIMIT 100;
FOR i IN 1 .. recs_EMP.COUNT LOOP
--何らかの処理
END LOOP;
--ここが疑問点
EXIT WHEN cur_EMP%NOTFOUND;
END LOOP;
CLOSE cur_EMP;
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
/ 上記のソースで「NOTFOUND」で悩んでおります。
NOTFOUNDをFETCHの直後に書くと最後の100件分の処理が行われず、
ループを抜けてしまうため END LOOP の直前に記述しました。
しかし、入門書を確認すると・・・
直前のFETCH文が行を取り出せた場合はFALSE 行を取り出せない場合はTRUEを戻す。
とあります。
直前のFETCHというのは、
FETCH cur_EMP BULK COLLECT INTO recs_EMP LIMIT 100;
となるはずであり、取り出されいるからこそ
FOR LOOPで処理をしているはず・・・
無難に以下のようなコーディングした方がよいのだろうか。
DECLARE
--カーソルを定義
CURSOR cur_EMP IS SELECT * FROM EMP;
TYPE t_EMP IS TABLE OF cur_EMP%ROWTYPE;
recs_EMP t_EMP;
BEGIN
--カーソルオープン
OPEN cur_EMP
LOOP
FETCH cur_EMP BULK COLLECT INTO recs_EMP LIMIT 100;
--取得件数が0件になった場合ループを抜ける
EXIT WHEN recs_EMP.COUNT = 0;
FOR i IN 1 .. recs_EMP.COUNT LOOP
--何らかの処理
END LOOP;
END LOOP;
CLOSE cur_EMP;
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
/
調べても、しっくりくる記事がないのでここに書きました。
PL/SQLに詳しい方、助言をお願いいたします。
以上