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操作,也能达到预期。



  • 相关阅读:
    面向对象的相关知识
    模块的导入
    正怎表达式在爬虫里的应用
    前端~css
    CSS知识点
    初识Html
    Python之路--协程/IO多路复用
    进程
    锁 和 线程池
    操作系统-并发-线程-进程
  • 原文地址:https://www.cnblogs.com/wenlong/p/3283948.html
Copyright © 2011-2022 走看看