假如一个存储过程中调用了另外一个存储过程,为了使两个存储过程之间的事务不会相互影响,就需要自主事务处理,下面举例。
create or replace procedure proc_useradd1
is
PRAGMA AUTONOMOUS_TRANSACTION; -- 用于标记子程序为自主事务处理
begin
insert into userinfo(userid,username) values(1,'张三');
rollback;
end;
create or replace procedure proc_useradd2
is
begin
insert into userinfo(userid,username) values(2,'李四');
proc_useradd1(); -- 调用过程proc_useradd1
commit;
end;
如上,存储过程proc_useradd2调用了proc_useradd1,proc_useradd1里面声明了它是自主事务处理的,所以两个子程序的事务不会相互影响,因此调用proc_useradd2之后,会向表userinfo中添加一条(2,'李四')记录,如果在proc_useradd1中没有声明自主事务处理的话,那么insert的数据就会全部被回滚,表中将不会添加进任何数据。