zoukankan      html  css  js  c++  java
  • Oracle触发器给表自身的字段重新赋值出现ORA-04091异常

    业务描述如下:

    在插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数据交换用,和系统业务没关系,不想修改程序,所以才用触发器的方式实现。


    表结构定义和触发器定义如下:

    create table debug_demo1(
    id varchar(32),
    name varchar(100),
    note varchar(200),
    primary key(id)
    );
    
    create or replace trigger tri_debug_demo1
    before insert on debug_demo1
    for each row
    begin
    update debug_demo1 set note = 'test' where id = :new.id;
    end tri_debug_demo1;


    结果执行insert操作的时候,Oracle出现了ORA-04091异常

    ORA-04091:表debug_demo1发生了变化 触发器/函数不能读它  
    ORA-06512: 在tri_debug_demo1 line...
    ORA-04088: 触发器tri_debug_demo1 执行过程中出错  


    对于此异常,这篇帖子http://www.iteye.com/topic/1124681说明得很详细


    在看了这篇帖子http://www.itpub.net/thread-1615812-1-1.html之后,找到了新的方法,那就是给字段直接赋值


    修改之后的触发器如下:

    create or replace trigger tri_debug_demo1
    before insert on debug_demo1
    for each row
    begin
    :new.note := 'test';
    end tri_debug_demo1;

    经过测试,可以正常进行insert操作,也能达到预期。



  • 相关阅读:
    windows服务程序
    DevExpress之时间控件
    DevExpress之列表控件
    Docker安装及基本使用
    配置阿里云yum源
    Centos7安装gitlab
    正则表达式
    sed进阶
    初识sed和gawk
    安装saltstack
  • 原文地址:https://www.cnblogs.com/wenlong/p/3283948.html
Copyright © 2011-2022 走看看