我正在编写一些代码,这些代码会将数十亿数据从一个表复制到另一个表,并且我们不希望该过程在出现异常时停止。所以我把脚本放在(不是把 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 块中,它会继续迭代吗?