美文网首页日更达人联盟
自治事物pragma autonomous_transactio

自治事物pragma autonomous_transactio

作者: 清_晨_ | 来源:发表于2019-02-12 15:23 被阅读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;

相关文章

  • 自治事物pragma autonomous_transactio

    PRAGMA AUTONOMOUS_TRANSACTION 使用自治事物时,当前的存储过程运行成功与否,不会对主事...

  • 24_#pragma使用分析【重点】

    关键词:#pragma简介、#pragma message、#pragma one、 内存对齐、#pragma p...

  • C语言day05-10递归练习02

    pragma mark 递归练习02 pragma mark 概念 pragma mark 代码 pragma m...

  • #pragma

    1.注释 消除编译警告 各种警告

  • #pragma

    #pragma声明主要由Xcode用来完成两个主要任务——整理代码和防止编译器警告。 整理代码 代码的整洁程度反映...

  • #pragma

    整理代码 在 @implementation 中使用 #pragma mark 来将代码分割成逻辑区块。Xcode...

  • Pragma

    在做注释特别是分段注释时,经常会用到 #pargam mark-但#pargma 另一个强大功能就是处理编译器警...

  • #pragma

    开门见山 pragam 声明在Xcode中主要起两个作用:整理代码和处理编译器警告 整理代码 我们经常通过 #pr...

  • C语言day06-12类型说明符

    pragma mark 类型说明符 pragma mark 概念 pragma mark 代码 #pragma m...

  • C语言day04-13for循环

    pragma mark for循环 pragma mark 概念 pragma mark 代码

网友评论

    本文标题:自治事物pragma autonomous_transactio

    本文链接:https://www.haomeiwen.com/subject/ackkeqtx.html