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语句,并且两个语句都可以使用时,回滚到保存点通常很有用update
,然后更改“l_count”变量的值。如果您希望在更改“l_count”时发生任何问题时回滚更新,则需要回滚到保存点
请记住,回滚到保存点不会恢复对PL/SQL变量的任何更改,例如“l_count”。在回滚到保存点之前,您负责根据需要还原它们的值。为什么要为一个简单的update语句执行这些pl/sql循环?逐行处理效率很低。你不应该使用“当别人”如果有异常,那么你需要确定原因,而不是忽略它。