読者です 読者をやめる 読者になる 読者になる

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


以上