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

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

只是想知道我们是否真的需要LOOP语句内的回滚/保存点,如果我们内部有异常捕获。

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;

我在查询上方有2个查询。

  1. 何时按上述顺序进行提交。
  2. 在上面的代码中,请考虑将异常引发在游标的中间(如第3或第4次迭代)。会添加回滚和保存点吗?当前,整个循环已完成,所有更新也已提交。
oracle exception plsql rollback savepoints
1个回答
0
投票

何时按上述顺序进行提交?

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

在上面的代码中,请考虑将异常引发在游标的中间(如第3或第4次迭代)。会添加回滚和保存点吗?当前,整个循环已完成,所有更新也已提交。

当您在游标循环内有multiple DML语句并且你们俩都有时,回滚到保存点通常很有用

  1. 想要确保对于每个游标记录,DML语句要么全部成功,要么都不成功
  2. 在处理完所有行之前都不愿提交任何东西

在您的情况下,循环内只有一个update,然后更改'l_count'变量的值。如果您希望在更改“ l_count”时发生任何问题时回滚更新,则需要回滚到保存点。

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

© www.soinside.com 2019 - 2024. All rights reserved.