我的oracle触发器如下:CREATE TRIGGER t_k
AFTER INSERT
ON "A主表"
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare v_glid B主表.关联ID%type;
begin select B关联ID into v_glid
from
B主表 a
,B从表 b
,A从表 c
where
rtrim(a.代码)=rtrim(:new.代码)
and a.所属年月=substr(:new.日期,1,6)
and a.关联ID=b.关联ID
and :new.关联ID=c.关联ID;
if :new.凭证类型='888' then
Update B从表
set 本月在途=本月在途+:new.金额合计
where 关联ID=v_glid;
end if;
end;
/
当我insert到A主表中时,发现触发器并没有像预期那样执行,并且程序完后,
发现本来的insert语句也失效了,就是说好像根本没有执行过insert一样。
A主表insert后本来应该有的记录没找到。
后来我发现,我在触发器程序中去掉:new的引用(直接使用字符串),发现触发器就执行了。A主表的记录也insert进去了~~真是郁闷,为什么我不能在触发器里面用:new的引用?要是这样的话我怎么才可以知道insert的内容啊?
AFTER INSERT
ON "A主表"
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare v_glid B主表.关联ID%type;
begin select B关联ID into v_glid
from
B主表 a
,B从表 b
,A从表 c
where
rtrim(a.代码)=rtrim(:new.代码)
and a.所属年月=substr(:new.日期,1,6)
and a.关联ID=b.关联ID
and :new.关联ID=c.关联ID;
if :new.凭证类型='888' then
Update B从表
set 本月在途=本月在途+:new.金额合计
where 关联ID=v_glid;
end if;
end;
/
当我insert到A主表中时,发现触发器并没有像预期那样执行,并且程序完后,
发现本来的insert语句也失效了,就是说好像根本没有执行过insert一样。
A主表insert后本来应该有的记录没找到。
后来我发现,我在触发器程序中去掉:new的引用(直接使用字符串),发现触发器就执行了。A主表的记录也insert进去了~~真是郁闷,为什么我不能在触发器里面用:new的引用?要是这样的话我怎么才可以知道insert的内容啊?
解决方案 »
- 为什么RxDBGrid的 DrawDataCell事件不触发.
- 欢迎+如DELPHI群:20941847
- 大家来聊聊,用数码相机拍摄的图片(JPG格式)与标准的JPG格式有什么不同?
- DSVIDEO_WINDOW_CHILD_STYLE 的定义在哪里?
- 求救:Intraweb在6.0以上的版本中,IWListbox不支持click了,怎么办?
- delphi有没有象vc的boundcheck这样的能够检查内存泄漏的工具?
- DBListBox可以直接显示出数据吗
- 对数据库进行EOF循环后,如何复位?
- 请教:在WORD中插入表格的问题!
- 请教如何判断'c:\rvabin' 是一个目录名还是一个文件名?
- oracle+delphi 帮帮忙!在线等待,会者有分
- TMainMenu=>TPopupMenu的問題
另外,去掉 REFERENCING NEW AS NEW OLD AS OLD
AFTER INSERT
ON "A从表"
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
v_glid B主表.关联ID%type;
v_sdm A从表.代码%type;
v_kpse A从表.金额%type;
v_glid1 A从表.关联ID%type;
v_pzlx A从表.类型%type;
begin v_sdm:=:new.代码;
v_kpse:=:new.金额;
v_glid1:=:new.关联ID;
v_pzlx:=:new.类型; select a.关联ID into v_glid
from
B主表 a
,B从表 b
,A主表 c
where
rtrim(a.代码)=rtrim(c.代码)
and a.所属年月=substr(c.日期,1,6)
and a.关联ID=b.关联ID
and b.代码=substr(v_sdm,1,3)
and v_glid1=c.关联ID;
if v_pzlx='888' then
Update B从表
set 本月在途=本月在途+v_kpse
where 关联ID=v_glid;
end if;
update B从表 set 本月合计=本月合计+1;
end;
/
发觉还是一样,没有效果。update B从表 set 本月合计=本月合计+1;用来检查的也是没有作用~~,郁闷~~~
然后我看书,用了中间变量即 包 中的 变量 来记录。
在Before Insert For Each Row记录每个添加的行到包中的数组中
(v_glid is Table of ...)
然后在After Insert的语句级触发器用for loop对每一个已记录的数组取值并查询,
发现结果还是一样,没有效果。真邪门了。一直令我不懂得是,触发器不能执行也就算了,
为什么相应的insert语句也没有效果?
现在问题好像变成了这样:在触发器里不能在DML语句(from,where)包括触发表的主键字段(用变量存储,用包变量存储也不行?!)
只要一包含了这些字段,触发器就无效,并且触发的语句也无效。并且也不报错。这些问题如何解决?(因为主健字段必须是用来查询的)
from
B主表 a
,B从表 b
,A主表 c
where
rtrim(a.代码)=rtrim(c.代码)
and a.所属年月=substr(c.日期,1,6)
and a.关联ID=b.关联ID
and b.代码=substr(v_sdm,1,3)
and v_glid1=c.关联ID;
你这条语句是不是返回值有好几行!!!????