日更达人联盟

自治事物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;
上一篇下一篇

猜你喜欢

热点阅读