一个oracle 数据库 触发器问题。

表1(xf_test1_tirg)结构:NUM1NUMBER(4);CHR1VARCHAR2(10)。表2(xf_test2_trig)结构:NUM2NUMBER(4);... 表1(xf_test1_tirg)结构: NUM1 NUMBER(4) ;CHR1 VARCHAR2(10) 。
表2(xf_test2_trig)结构:NUM2 NUMBER(4) ;CHR2 VARCHAR2(10) 。
触发器1:
create or replace trigger test_tir
before insert on xf_test1_tirg
for each row
when (new.num1=1)
declare
num_l number;
begin
select count(*) into num_l from xf_test1_tirg ;
loop
exit when num_l>=20;
insert into xf_test2_trig values (-1,'error');
commit;
end loop;
end;
触发器2:
create or replace trigger test2_tri
before insert on xf_test2_trig
for each row
when (new.num2=-1 and new.chr2='error')
begin
insert into xf_test1_tirg (num1) values(1);
commit;
end;
--
运行 insert into xf_test2_trig values (-1,'error');
报错:
ERROR at line 1:
ORA-01000: maximum open cursors exceeded
ORA-06512: at line 2
ORA-04088: error during execution of trigger 'REPORT.TEST2_TRI'
ORA-06512: at line 2
ORA-04088: error during execution of trigger 'REPORT.TEST_TIR'
求高手解答一下原因。
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
frogley
2014-03-04 · TA获得超过1854个赞
知道小有建树答主
回答量:1008
采纳率:50%
帮助的人:1080万
展开全部
你这里两个触发器相互触发,形成死循环了。
追问
触发器1中有一句“exit when num_l>=20;  ” 就是为了解决死循环的问题的。
追答

两码事。


我详细讲讲你的语句会如何执行:

  1.  执行insert into xf_test2_trig values (-1,'error')时,由于test2_tri是xf_test2_trig表上的before insert触发器,因此会先执行此触发器(触发器执行完毕后才会执行insert);

  2. 触发器test2_tri执行到insert into xf_test1_tirg (num1) values(1)这一句。由于xf_test1_tirg表上有before insert触发器,因此会先执行此触发器(触发器执行完毕后才会执行insert);

  3. 注意insert语句一直没有真正执行,因此num_l始终为0。触发器test1_tri会执行到insert into xf_test2_trig values (-1,'error')这一句。这就回到了1的状态。

此后,会一直这样循环下去,直到超出最大游标数。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式