oracle存储过程中事务的管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档