Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PLSQL异常中的回滚_Sql_Oracle_Exception Handling_Plsql - Fatal编程技术网

PLSQL异常中的回滚

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

想知道在检测到其他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
                            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是另一种动物,您可以明确地告诉它自动提交任何一组语句。