Oracle触发器给表自身的字段重新赋值出现ORA-04091异常

WBOY
풀어 주다: 2016-06-07 17:30:39
원래의
1498명이 탐색했습니다.

Oracle下插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数

业务描述如下:

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

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

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 执行过程中出错

对于此异常,这篇帖子说明得很详细

找到了新的方法,那就是给字段直接赋值

修改之后的触发器如下:

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

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

linux

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!