PLSQL oracle的循环内部是否需要保存点?

PLSQL oracle的循环内部是否需要保存点?,oracle,exception,plsql,rollback,savepoints,Oracle,Exception,Plsql,Rollback,Savepoints,只是想知道如果我们在循环语句中有异常捕获,是否真的需要回滚/保存点 create table my_Tab (id number, name varchar2(10), address varchar2(100)); insert into my_tab values (1,'ABC','XXX'); insert into my_tab values (2,'DEF','YYY'); insert into my_tab values (3,'GHI','ZZZ'); insert into

只是想知道如果我们在循环语句中有异常捕获,是否真的需要回滚/保存点

create table my_Tab
(id number,
name varchar2(10),
address varchar2(100));

insert into my_tab values (1,'ABC','XXX');
insert into my_tab values (2,'DEF','YYY');
insert into my_tab values (3,'GHI','ZZZ');
insert into my_tab values (4,'JKL',null);

DECLARE
CURSOR cur_my_tab is
select * from my_tab;
l_var varchar2(100);
l_count number := 0;
begin
for rec_my_tab in cur_my_tab
loop
    BEGIN
    dbms_output.put_line('id' || rec_my_tab.id);
    --savepoint sv_cur_my_tab;
        dbms_output.put_line('name' || rec_my_tab.name);
        select rec_my_tab.address into l_var from dual;
        update my_Tab set id = id +4 where id = rec_my_tab.id;
        dbms_output.put_line(l_var);
        if rec_my_tab.address ='xxx' then
            l_count:= rec_my_tab.id/l_count;
        END IF;
    Exception
        when others then 
            dbms_output.put_line('in inner exception');
            --rollback to sv_cur_my_tab;*/
    end;
end loop;
Exception
    when others then 
        dbms_output.put_line('in outer exception');
        --rollback to sv_cur_my_tab;
end;
我有两个以上的问题

  • 按照上述顺序,提交何时发生
  • 在上面的代码中考虑异常是在光标中间抛出的(像第三次或第四次迭代)。添加回滚和保存点会改变这种情况吗?目前,整个循环已完成,所有更新也已提交 在上面的顺序中,提交什么时候发生

    没有。至少,我没有看到
    commit
    语句。也许我是瞎子。但是PL/SQL中没有“自动提交”。因此,在您发布一个之前(或您的客户端软件发布一个之前),不会发生
    commit

    在上面的代码中考虑异常是在光标的中间抛出的(像第三次或第四次迭代)。添加回滚和保存点会改变这种情况吗?目前,整个循环已完成,所有更新也已提交

    当游标循环中有多个DML语句,并且两个语句都可以使用时,回滚到保存点通常很有用

  • 要确保对于每个游标记录,DML语句 要么全部成功,要么一个也没有成功
  • 在处理所有行之前,不希望提交任何内容
  • 在本例中,循环中只有一个
    update
    ,然后更改“l_count”变量的值。如果您希望在更改“l_count”时发生任何问题时回滚更新,则需要回滚到保存点


    请记住,回滚到保存点不会恢复对PL/SQL变量的任何更改,例如“l_count”。在回滚到保存点之前,您负责根据需要还原它们的值。

    为什么要为一个简单的update语句执行这些pl/sql循环?逐行处理效率很低。你不应该使用“当别人”如果有异常,那么你需要确定原因,而不是忽略它。