Oracle数据库如何解决ORA-04091触发器/函数不能读它的问题

这是学校给出的作业中的一道题目:
使用create trigger语句创建触发器tri_insert,创建一个insert类型的触发器,要求当用户在student表中插入的班级号为99时,自动将班级号修改为1;
然后编写代码如下:

create or replace trigger tri_insert
after insert on student
for each row
begin
update student set class=1 where class=99;
end tri_insert;

编译是能通过的,但是插入数据的时候就出问题了:
ORA-04091: 表 HR.STUDENT 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "HR.TRI_INSERT", line 5
ORA-04088: 触发器 'HR.TRI_INSERT' 执行过程中出错
去网上找了一下,知道错误的原因是,
trigger 中的执行语句不能读写 它依附的表。
度娘上搜到的很多解决方案例子都是解决select语句问题的,用:new和:old就解决了,
但是针对这个问题,要对student表中的class进行update 操作,应该怎么办?

有人说把代码里面的after改为before

改了之后,的确插入语句不会报错,但问题就变成这样了。
插入第一个学生,班级为99,并不会触发触发器修改班级为1
插入第二个学生,班级为任意,这样才能触发触发器,修改第一个学生的班级为1
这样显然没有解决问题
那么有没有办法能够在插入第一个学生,班级为99的时候,就触发触发器修改其班级为1呢?

只能求助万能牛逼的各位网友了,感激不尽。

解决ORA-04091触发器/函数不能读它,需用oracle的自治事务。
举例如下:
create or replace trigger TR_U_ID_SYNCH
before update on COMPANY referencing old as old_value
new as new_value
for each row
declare
tId company.id%type;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
if :new_value.U_ID is not null and :new_value.U_ID!=ld_value.U_ID then
select t.t_id into tId from company t where t.id= :new_value.U_ID;
:new_value.P_ID :=:new_value.U_ID;
:new_value.T_ID :=tId;
end if;
COMMIT;
end TR_CO_GB_ID_SYNCH;
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-27
create or replace trigger tri_insert
before insert on student
for each row
when (new.class=99)
begin
:new.class:=1;
end tri_insert;本回答被提问者采纳
相似回答