类型:转载 责任编辑:asp 日期:2007/03/01
aa表为表头
bb表为名细,
bb上建有触发器,删除记录时需要读取表头的信息,并据此做相应的处理;
aa上用触发器实现aa-->bb的级连删除
脚本如下:
直接删除bb表记录没有问题,但试图删除aa表记录时出错;
可能是执行操作的顺序有问题,即级连删除时不能访问表头(以被修改)
但要想实现上面的功能应该怎么修改呢?
=================================================================
create table aa(
no varchar2(5),
flag varchar2(1)
);
create table bb(
no varchar2(5),
dd varchar2(10));
create or replace trigger ord_aa_tr before delete on aa for each row
begin
delete from bb where no=:old.no;
end ord_aa_tr;
/
create or replace trigger ord_bb_tr before delete on bb for each row
declare
q varchar2(10);
begin
select flag into q from aa where no=:old.no;
--......其它处理
end ord_aa_tr;
/
insert into aa values(001,1);
insert into bb values(001,abc);
delete from aa;
error 位于第 1 行:
ora-04091: 表 ccduser.aa 发生了变化,触发器/函数不能读
ora-06512: 在"ccduser.ord_bb_tr", line 4
ora-04088: 触发器 ccduser.ord_bb_tr 执行过程中出错
ora-06512: 在"ccduser.ord_aa_tr", line 2
ora-04088: 触发器 ccduser.ord_aa_tr 执行过程中出错
================================================================
推荐阅读
形成循环了!
这样不行
可以通过另外一个表
保存需要的信息
通过触发器保存起来
然后再取出来用
select flag into q from aa where no=:old.no;
exception
when others then
...
end;
但楼主语句没有涉及循环触发。
对aa表执行行级触发器的时候
触发bb表的触发器,读aa表中数据//不可以这样
楼主意思是否每论删除a、b都想得到flag值呢?
select flag into q from aa where no=:old.no;
那可以用函数来实现了。
create or replace function get_flag(p_id in varchar2)
return varchar2
as
v_q varchar2(10);
begin
select flag into q from aa where no=p_id;
return v_q;
end;
/
create or replace trigger ord_aa_tr before delete on aa for each row
declare
rt varchar2(10);
begin
rt:=get_flag(:old.no);
delete from bb where no=:old.no;
end ord_aa_tr;
/
create or replace trigger ord_bb_tr before delete on bb for each row
declare
q varchar2(10);
begin
q:=get_flag(:old.no);
--......其它处理
end ord_aa_tr;
/