有什么办法可以合并下面的更新语句

问题描述 投票:0回答:1

我正在寻找结合这两个更新语句的最佳方法,或者至少如果第一次失败,是否有最好的方法来报告第二次更新以及失败,而不是盲目地运行和完成第二次更新语句:

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

plsql database-administration
1个回答
0
投票

不是 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;
© www.soinside.com 2019 - 2024. All rights reserved.