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

这是学校给出的作业中的一道题目:使用createtrigger语句创建触发器tri_insert,创建一个insert类型的触发器,要求当用户在student表中插入的班... 这是学校给出的作业中的一道题目:
使用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呢?

只能求助万能牛逼的各位网友了,感激不尽。
展开
 我来答
育知同创教育
2016-01-31 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
解决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;
华夏日长兴
推荐于2017-11-27 · TA获得超过9593个赞
知道大有可为答主
回答量:6305
采纳率:85%
帮助的人:3751万
展开全部
create or replace trigger tri_insert
before insert on student
for each row
when (new.class=99)
begin
:new.class:=1;
end tri_insert;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式