自治事物pragma autonomous_transactio
2019-02-12 本文已影响124人
清_晨_
PRAGMA AUTONOMOUS_TRANSACTION
使用自治事物时,当前的存储过程运行成功与否,不会对主事物产生影响。
例如,使用自治事物的存储过程中,commit,rollback操作只会提交或回滚当前自治事务中的DML,不会影响到主程序中的DML。非自治事务中的commit,rollback是会影响整个事务的。
比如,当我们在select 语句中使用自己定义的函数,并且这个函数除了返回特定的值之外,还可以执行update,insert,delete等操作。 这个时候,我们可以使用PRAGMA AUTONOMOUS_TRANSACTION来实现。
可以看一下下面的例子:
Create or replace function getid return int is
pragma autonomous_transaction;
vid int;
begin
select max(id) into vid from test;
update test set id = id + 1;
commit;
return vid;
end;
注:使用自治事物的时候,一定要加commit;
SQL> select func_getid from dual;
FUNC_GETID
----------
1
SQL> select func_getid from dual;
FUNC_GETID
----------
2
另外,在触发器中,我们同样会用到自治事物,下面我是项目中用到的一个触发器,可以作为一个参考。
create or replace trigger person_base_info_trigger
before insert or update on t_person_base_info
for each row
declare
pragma autonomous_transaction;--自治事物
v_cid varchar2(32) := :new.c_id; -- 保存更新或修改行的主键
v_count number(10); -- 临时表 send_data_tmp 中 相同数据的记录数
v_idno varchar2(18) := :new.id_no; -- 身份证号码
v_health_record_id varchar2(32) := :new.c_id; -- 健康档案编号
v_special_crowd varchar2(128) := :new.special_crowd; -- 特殊人群标记
begin
if (regexp_count(v_special_crowd, '13', 1, 'i') = 0 and
regexp_count(v_special_crowd, '14', 1, 'i') = 0) or v_idno is null then
return; ---RETURN 意思是返回,直接跳出存储过程,RETURN 下的语句都不执行
end if;
select count(*)
into v_count
from send_data_tmp
where tradeno = '0401'
and pk = v_cid;
if v_count = 0 then
-- 如果临时表 send_data_tmp 中与该数据相同的记录数为 0,则插入该条数据。
insert into send_data_tmp_0401
values
('0401', v_cid, v_idno, v_health_record_id);
commit;
end if;
exception
when others then
rollback;
commit;
end;