あるテーブルから別のテーブルに何十億ものデータをコピーするコードを作成していますが、例外が発生した場合に手順を停止したくありません。だから私は(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つの質問があります
- forall ループでコレクションを削除しています。例外があり、dml_errors ブロックでコレクションから情報を取得することにした場合、そこにコレクション要素がありますか? はいの場合、ログに記録した後にそれらを削除しても安全ですか?
- forall を begin-exception-end ブロックに保持しているので、反復し続けますか?