0

あるテーブルから別のテーブルに何十億ものデータをコピーするコードを作成していますが、例外が発生した場合に手順を停止したくありません。だから私は(100%コンパイル可能な構文を入れていない)のようなスクリプトを入れています

dml_errors      exception;
errors          number;
error_count     number;
pragma exception_init (dml_errors, -24381);

---------
open cursor;
begin loop;
   fetch cursor bulk collect into tbl_object limit batch_size;
   exit when tbl_object.count = 0;
   -- perform business logic
   begin
       forall in tbl_object save exceptions;
          insert into table;
          tbl_object.delete;
   exception
       when dml_errors then
                errors      :=  sql%bulk_exceptions.count;
                error_count :=  error_count + errors;
                insert into log_table (tstamp, line) values (sysdate, SUBSTR('[pr_procedure_name:'||r_guid||'] Batch # '||batch_number - 1||' had '||errors||' errors',1,300));
   end;
end loop;
close cursor;
end procedure;

この疑似コードに基づいて、2つの質問があります

  1. forall ループでコレクションを削除しています。例外があり、dml_errors ブロックでコレクションから情報を取得することにした場合、そこにコレクション要素がありますか? はいの場合、ログに記録した後にそれらを削除しても安全ですか?
  2. forall を begin-exception-end ブロックに保持しているので、反復し続けますか?
4

1 に答える 1