バルク時の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に詳しい方、助言をお願いいたします。
以上