oracle存储过程中事务的管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.存储过程中的commit与rollback
create table A
(
A VARCHAR2(46) not null, primary key (A)
)
create table B
(
A VARCHAR2(46)
)
create table C
(
A VARCHAR2(46)
)
表B中插入值
Insert into B(A) valus(‘a’);
Insert into B(A) valus(‘b’);
Insert into B(A) valus(‘b’);
Insert into B(A) valus(‘c’);
1.
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
insert into c(a)values(v_cur.a) ;
insert into a(a)values(v_cur.a) ;
end loop;
end;
执行结果:A、C表中均无记录。系统启动隐式事务,在遇到异常时自动回滚。
2.
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
insert into C(a)values(v_cur.a) ;
end loop;
end;
执行结果:C表中无记录。系统启动隐式事务,但等待提交或回滚。Commit后C表中可查询到插入的4条数据。
3
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
begin
insert into c(a)values(v_cur.a) ;
insert into a(a)values(v_cur.a) ;
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
end loop;
end;
执行结果:A、C表中无记录。系统启动隐式事务,但等待提交或回滚。Commit后C表中可查询到插入的a/b/b/c,A表中可查询到插入的a/b/c。
4.
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
begin
insert into c(a)values(v_cur.a) ;
insert into a(a)values(v_cur.a) ;
commit;-- m
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
end loop;
--commit; n
end;
执行结果:C表中可查询到插入的a/b/b/c,A表中可查询到插入的a/b/c。根据需要可以在m、n两处进行commit。
5.
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
begin
insert into c(a)values(v_cur.a) ;
insert into a(a)values(v_cur.a) ;
commit;-- m
EXCEPTION
WHEN OTHERS THEN
rollback; --new
end;
end loop;
end;
执行结果:C表中可查询到插入的a/b/c,A表中可查询到插入的a/b/c。即,如果希望过程中的语句按事务处理,需要在异常时进行rollback。
6.
create or replace procedure test as
begin
for v_cur in (select a from b)
loop
begin
insert into c(a)values(v_cur.a) ;
insert into a(a)values(v_cur.a) ;
end;
end loop;
commit;
EXCEPTION
WHEN OTHERS THEN
rollback;
end;
执行结果:C表、A表均为空。即,如果过程中的动作有先后顺序要求,希望对整个过程按事务处理,则需要调整exception的位置到最后。
7.
create or replace procedure test as
begin
declare
myerror varchar2(200);
begin
for v_cur in (select a from b)
loop
begin
insert into c(a)values(v_cur.a) ;
-- insert into a(a)values(v_cur.a) ;
end;
end loop;
commit;
EXCEPTION
WHEN OTHERS THEN
myerror:=substr(sqlcode||sqlerrm,1,120);
rollback;
insert into err_logs(name,memo,err_time) values('test',myerror,sysdate);
commit;
end;