我正在寻找结合这两个更新语句的最佳方法,或者至少如果第一次失败,是否有最好的方法来报告第二次更新以及失败,而不是盲目地运行和完成第二次更新语句:
code
update empn.alloc1 P set emailaddress = dbms_random.string('X', 20)||'@nodomain.com' where emailaddress is not null;
承诺;
update (select p2.emailaddress email2, p1.emailaddress email1 from empn.alloc2 P2,empn.alloc1 P1 where p2.id = p1.id) abc set email2 = email1 ;
承诺;
code
不是 100% 确定你想要什么,所以在下面添加了两个选项
选项1
如果任一更新语句失败,它将回滚所有已完成的更新,并将错误记录到 dbms_output(这应该替换为您使用的任何日志系统)。
Begin
udpate statment 1;
update statment 2;
commit;
exception when others then
dbms_output.put_line('error niether update committed ' || sqlerrm );
rollback;
end;
选项2
如果更新语句 1 成功,则它会被提交,然后继续进行第二次更新,如果第二次更新失败,则第一个更新将被持久化,但我们会记录错误并回滚第二个更新。 如果第一次更新失败,那么它将记录错误并引发主异常,其中回滚完成后第二次更新永远不会运行。 如上所述,dbms_output 应该替换为您使用的任何日志系统
Begin
begin
udpate statment 1;
commit;
exception when others then
dbms_output.put_line('update statment 1 failed ' || sqlerrm );
raise;
end;
begin
update statment 2;
commit;
exception when others then
dbms_output.put_line('error update statment 1 commited, update statment 2 failed ' || sqlerrm );
raise;
exception when others then
rollback;
end;