一个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'
求高手解答一下原因。 展开
表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'
求高手解答一下原因。 展开
若以下回答无法解决问题,邀请你更新回答
1个回答
展开全部
你这里两个触发器相互触发,形成死循环了。
追问
触发器1中有一句“exit when num_l>=20; ” 就是为了解决死循环的问题的。
追答
两码事。
我详细讲讲你的语句会如何执行:
执行insert into xf_test2_trig values (-1,'error')时,由于test2_tri是xf_test2_trig表上的before insert触发器,因此会先执行此触发器(触发器执行完毕后才会执行insert);
触发器test2_tri执行到insert into xf_test1_tirg (num1) values(1)这一句。由于xf_test1_tirg表上有before insert触发器,因此会先执行此触发器(触发器执行完毕后才会执行insert);
注意insert语句一直没有真正执行,因此num_l始终为0。触发器test1_tri会执行到insert into xf_test2_trig values (-1,'error')这一句。这就回到了1的状态。
此后,会一直这样循环下去,直到超出最大游标数。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询