我建立一个触发器,实现当向A表插入一条数据时,向B表插入与之有关联的一条数据。为什么会有ORA-04091?
--触发器createorreplacetriggerB_trgafterinsertorupdateordeleteonAforeachrow--A表一更新就触发dec...
--触发器
create or replace trigger B_trg
after insert or update or delete on A for each row --A表一更新就触发
declare
begin
B_cud(:NEW.cCode,:NEW.cName,:NEW.upperCode);
end;
go;
--存储过程
create or replace procedure B_cud(
addCode in number,
addName in varchar2,
upp in number
)
is
v_b number;
begin
select 1 into v_b from dual where exists (select org_Code from B where city_code =upp);
insert into B values (
……
)
exception
when no_data_found then
…….
end;
=============
然后执行 insert into A values(……);
后就报错:
============
触发器还不能改成表级触发,那样直接就编译不通过。
因为不能用:New和:Old了。 展开
create or replace trigger B_trg
after insert or update or delete on A for each row --A表一更新就触发
declare
begin
B_cud(:NEW.cCode,:NEW.cName,:NEW.upperCode);
end;
go;
--存储过程
create or replace procedure B_cud(
addCode in number,
addName in varchar2,
upp in number
)
is
v_b number;
begin
select 1 into v_b from dual where exists (select org_Code from B where city_code =upp);
insert into B values (
……
)
exception
when no_data_found then
…….
end;
=============
然后执行 insert into A values(……);
后就报错:
============
触发器还不能改成表级触发,那样直接就编译不通过。
因为不能用:New和:Old了。 展开
展开全部
你好,看了昨天那个存储过程,你的insert into里面需要select A表,而你在行级触发器里面调用了存储过程,其实就是间接进行了select操作了。我建议你生成一个临时表或包,在触发器里,将new值和old值插入临时表中,然后从临时表里取数,这样是没问题的,操作完成后把临时表清空。这样其实也比较方便。
更多追问追答
追问
现在需要真正的查询A表了,
因为A表是自相关联的。
A表的一个字段是和另一个字段有关,
比如部门表,每个部门有一个编号,还有一个上级部门的编号。
现在需要在A表中加入一个部门时,在B表中将上级的名字和编号、上上级的名字和编号都显示出来。这触发器怎么写
追答
在A表中加入一个部门,其实是新增一条记录,插入该记录不是连同上级和上上级的字段一同插入的么。不太听懂你的意思,能附上具体表结构说明最好了。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询