PLSQLのFORALL文でSAVE EXCEPTIONS句をつける

PLSQLのFORALL文でSAVE EXCEPTIONS句をつける

PLSQLのFORALL文でSAVE EXCEPTIONSというオプションを付けることができます。

FORALL i IN 1..tab.COUNT SAVE EXCEPTIONS
UPDATE~~~

FORALLで1000件処理した場合、どれか1件でエラーとなった場合、どのレコードがどういうエラーかわかりません。

SAVE EXCEPTIONS句をつけることにより、どういうエラーか、どの行がエラーかがわかります。

エラーなのでEXCEPTION部分に以下のように記述します。

EXCEPTION
  WHEN
    IF SQLCODE = -24381 THEN
      FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP
        errMsg := SQLERRM(-(SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
        bad_line := SQL%BULK_EXCEPTIONS(i).ERROR_INDEX;
        EXIT; --1件のみ出力
      END LOOP;
    END IF;

errMsgにはORA-xxxxxというようなコードが入ります。

bad_lineには行数が入ります。

上記の例では1件出力して終了しています。

ちなみにFORALLで1000件処理し、501件目でエラーが出た場合、500件目まではコミットされます。

コメント

タイトルとURLをコピーしました