只是想知道如果我们内部有异常捕获,我们是否真的需要在 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 个查询。
- 提交何时按上述顺序发生。
- 在上面的代码中,考虑在光标中间抛出异常(如第 3 次或第 4 次迭代)。添加回滚和保存点会对此进行更改吗?目前,整个循环已完成,所有更新也正在提交。