zoukankan      html  css  js  c++  java
  • (转)oracle触发器使用:after insert 与before insert的简单使用注意

    本文转载自:http://blog.csdn.net/kuangfengbuyi/article/details/41446125

    创建触发器时,触发器类型为after insert ,

    在begin中

    Select fieldA into v_a from tableA;

    执行到此句时,会出错:

    --弹出错误信息提示 

       --ORA-04091:表tr_table发生了变化触发器/函数不能读它 

       --ORA-06512: 在iu_table line 2 

    --ORA-04088: 触发器iu_table 执行过程中出错 

    问题分析:

    在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。

    解决方案:

    出错的原因是因为触发器和DML语句在同一事务管理中,所以方案一便是将触发器和DML语句分成两个单独的事务处理。这里可以使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。

    Declare

    pragma autonomous_transaction;  

    begin

    -------

    --这里需要显示提交事务

    Commit;

    End;

    同时,触发器不能更新触发条件所在的行。

    例如:

    Create or replace trigger tri_A

    After  insert on tableA

    For each row

    Declare

    pragma autonomous_transaction;  

    begin

    update tableA set fieldA=1 where id=:new.id;

    end;

    当你插入数据时,会发现,这个update语句有执行,却不生效。

    然后想改为:new.fieldA= 1,执行后,报错:

    ORA-04084:无法更改此触发器类型的new值

    这时候,要更换策略了,不过,也得根据个人需求了,

    刚好我的需求可以通过更新触发器类型after insert 为before insert

  • 相关阅读:
    this.$route和this.$router的区别
    HTTP请求方式中get和post的区别
    如何使用NPM?CNPM又是什么?
    javascript通过navigator.userAgent识别各种浏览器
    用JS添加和删除class类名
    前端布局神器display:flex
    强大的display:grid
    自动化测试的那些事儿
    selenium家族发展史
    第八章、函数进阶之字典生成式与匿名函数
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/5109865.html
Copyright © 2011-2022 走看看