只是想知道我们是否真的需要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个查询。
何时按上述顺序进行提交?
不是。至少,我看不到commit
语句。也许我是盲人。但是PL / SQL中没有“自动提交”。因此,在您发布一个(或客户端软件会发布)之前,不会出现commit
。
在上面的代码中,请考虑将异常引发在游标的中间(如第3或第4次迭代)。会添加回滚和保存点吗?当前,整个循环已完成,所有更新也已提交。
当您在游标循环内有multiple DML语句并且你们俩都有时,回滚到保存点通常很有用
在您的情况下,循环内只有一个update
,然后更改'l_count'变量的值。如果您希望在更改“ l_count”时发生任何问题时回滚更新,则需要回滚到保存点。
请记住,回滚到保存点不会恢复对PL / SQL变量的任何更改,例如'l_count'。回滚到保存点之前,您有责任根据需要还原它们的值。