PLSQL异常中的回滚
想知道在检测到其他SQL异常时是否需要回滚:PLSQL异常中的回滚,sql,oracle,exception-handling,plsql,Sql,Oracle,Exception Handling,Plsql,想知道在检测到其他SQL异常时是否需要回滚: declare cursor c_test is select * from tesing; begin for rec in c_test loop begin update test1 set test1.name=rec.name where test1.id=rec.id; IF sql%rowcount = 1 THEN
declare
cursor c_test is
select *
from tesing;
begin
for rec in c_test loop
begin
update test1 set test1.name=rec.name where test1.id=rec.id;
IF sql%rowcount = 1 THEN
commit;
ELSIF sql%rowcount =0 THEN
dbms_output.put_line('No Rows Updated');
else
dbms_output.put_line('More than 1 row exists');
rollback;
END IF;
exception when others then
dbms_output.put_line(Exception');
rollback;
end;
end;
首先,我假设我们可以忽略语法错误,例如,没有结束循环,dbms_output.put_line调用缺少第一个单引号,等等 至于是否有必要回滚更改,这取决于 通常,循环中不会有临时提交。这通常是一个糟糕的体系结构,因为它在I/O和运行时间方面要昂贵得多。这也使得编写可重启代码变得更加困难。例如,如果SELECT语句选择了10行,您发出并提交了5次更新,然后第6次更新失败,会发生什么情况?修复异常后,能够重新启动第6行的唯一方法是使用一个单独的表来存储和更新代码的进度。它还为调用该块的任何代码带来问题,该块必须处理一半的工作已经完成并提交,而另一半没有完成的情况 通常,您只会将事务控制语句放在代码的最外层块中。由于过程中的提交或回滚会提交或回滚会话中完成的任何工作,无论该工作是否由过程完成,因此在添加事务控制语句时要非常谨慎。您通常希望让调用方决定是提交还是回滚。当然,这仅限于此-最终,您将处于最外层的块中,而这些块将永远不会从其他例程调用,并且您需要具有适当的事务控制-但如果您正在编写可能被重用的代码,则需要非常小心 在本例中,由于您有临时提交,回滚的唯一效果是,如果第一个update语句失败,那么在调用此块之前在会话中完成的工作将回滚。如果第一个update语句成功,则临时提交将提交以前的更改。当人们谈到为什么可重用块中的临时提交和事务控制存在问题时,他们担心会产生这种副作用。我会在Oracle中阅读Tom Kyte的文章。SQL*Plus是另一种动物,您可以明确地告诉它自动提交任何一组语句。