怎么会这样的呢?

zysys 2003-05-27 08:52:19
当我修改ACC_SUB_COD表中的SUB_END列时,

SELECT SUM(:old.SUB_END*:old.INT_DEB_CRE) INTO oldEND FROM ACC_SUB_COD WHERE INT_REP=(SELECT NUM FROM ACC_REP_COD) GROUP BY INT_REP;//此语句出错:
ORA-04091表ACC_SUB_COD发生了变化,触发器/函数不能读。
ORA-06512"ACC_SUB_COD_UPD" LINE 8 (就是上面一句)。
ORA-04088 触发器 ACC_SUB_COD_UPD"执行过程中出错。
UPDATE ACC_REP_COD
SET REP_END=REP_END-OLDEND
WHERE NUM=:NEW.INT_REP;
...全文
55 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zysys 2003-06-02
  • 打赏
  • 举报
回复
谢谢你!!!!
Lastdrop 2003-06-02
  • 打赏
  • 举报
回复
decode(num,:old.rep_num,:new.sub_end*:new.deb_cre,0)

如果需要decode,也应该是decode(num,:new.rep_num,:new.sub_end*:new.deb_cre,0)
而你的查询条件已经有WHERE num=:new.rep_num;,所以num是肯定等于:new.rep_num的,也就不需要decode了。


things 2003-05-31
  • 打赏
  • 举报
回复
gz
zysys 2003-05-31
  • 打赏
  • 举报
回复
是我搞错了,Lastdrop你说的很对,大概是我不懂decode函数的用法,我后来看看了书,rep_num是acc_sub_cod表的,你的触发器我试了,很正确,但是我有一点搞不懂,
rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
+ :new.sub_end*:new.deb_cre
能不能写成 rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
+decode(num,:old.rep_num,:new.sub_end*:new.deb_cre,0)这个也要条件查询的呀,是不是有了上面的“DECODE”下面就不要用了。

beckhambobo(beckham):整个触发器代码我写了呀,不过是SQL SERVER 7。0的,不知写成ORACLE 怎么写!
beckhambobo 2003-05-30
  • 打赏
  • 举报
回复
楼主把整个触发器代码写出来吧。
Lastdrop 2003-05-30
  • 打赏
  • 举报
回复
rep_num这个字段是哪个表的?我以为是acc_sub_cod的,在acc_sub_cod表的触发器中调用字段值当然要指定:new或:old了。
zysys 2003-05-30
  • 打赏
  • 举报
回复
decode(num,:old.rep_num......) 为什么要用‘:old.rep_num’,而不可以用‘rep_num’?
Lastdrop 2003-05-29
  • 打赏
  • 举报
回复
行级触发器是指每更改一条记录时都会触发,所以不需要查询,也不需要累加,每条记录的更新都执行下面的语句,也就等于累加了!

rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
+ :new.sub_end*:new.deb_cre

你可以试试我写的触发器,使用一条更新很多条记录的SQL语句,应该可以达到你要的效果。
zysys 2003-05-29
  • 打赏
  • 举报
回复
是这样的呀~! 可是我这里有子查询条件,应该怎么写呢?
UPDATE acc_rep_cod
SET rep_end=rep_end-(SELECT SUM(sub_end*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)//子查询条件rep_num=acc_rep_cod.num
+(SELECT SUM(sub_end*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)//子查询条件rep_num=acc_rep_cod.num
WHERE num=(SELECT rep_num FROM inserted)

num是acc_sub_cod的主键。

Lastdrop 2003-05-29
  • 打赏
  • 举报
回复
看了你的SQL SERVER的触发器我有点明白你的目的了。Oracle的触发器有两种一种是行级,一种是语句级,你的SQL SERVER触发器相当于语句级触发器,但是你要得到该语句所更新的值的总和,只要在行级触发器中处理,不需要sum也可以,多次触发行触发器等于语句级的累加。下面的触发器应该能够满足你的要求,不过希望num是acc_sub_cod的主键。

CREATE OR REPLACE TRIGGER acc_sub_cod_upd
AFTER UPDATE ON acc_sub_cod
FOR EACH ROW
BEGIN
IF :old.sub_end <> :new.sub_end then
UPDATE acc_rep_cod
SET rep_end=rep_end-decode(num,:old.rep_num,:old.sub_end*:old.deb_cre,0)
+ :new.sub_end*:new.deb_cre
WHERE num=:new.rep_num;
END IF;
IF :old.sub_beg <> :new.sub_beg then
UPDATE acc_rep_cod
SET rep_end=rep_end-decode(num,:old.rep_num,:old.sub_beg*:old.deb_cre,0)
+ :new.sub_beg*:new.deb_cre
WHERE num=:new.rep_num;

:new.sub_end=:old.sub_end-:old.sub_beg+:new.sub_beg;
END IF;
end;
/

zysys 2003-05-28
  • 打赏
  • 举报
回复
这样吧! 我给你们看看在SQL SERVER 7。0中这个触发器的写法,我运行过完全正确!
CREATE TRIGGER dbo.acc_sub_cod_upd ON dbo.acc_sub_cod
FOR UPDATE
AS
IF update(sub_end)
BEGIN
UPDATE acc_rep_cod
SET rep_end=rep_end-(SELECT SUM(sub_end*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
+(SELECT SUM(sub_end*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
WHERE num=(SELECT rep_num FROM inserted)
END
IF update(sub_beg)
BEGIN
UPDATE acc_rep_cod
SET rep_beg=rep_beg-(SELECT SUM(sub_beg*deb_cre) FROM deleted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
+(SELECT SUM(sub_beg*deb_cre) FROM inserted WHERE rep_num=acc_rep_cod.num GROUP BY rep_num)
WHERE num=(SELECT rep_num FROM inserted)
UPDATE acc_sub_cod
SET sub_end=sub_end-(SELECT sub_beg FROM deleted)
+(SELECT sub_beg FROM inserted)
WHERE num=(SELECT num FROM inserted)
END
zysys 2003-05-28
  • 打赏
  • 举报
回复
是不是上次的问题,不能查询自己被修改的表!
zysys 2003-05-28
  • 打赏
  • 举报
回复
不是的,要用到SUM这个函数,
Lastdrop 2003-05-28
  • 打赏
  • 举报
回复
SELECT SUM(:old.SUB_END*:old.INT_DEB_CRE) INTO oldEND FROM ACC_SUB_COD WHERE INT_REP=(SELECT NUM FROM ACC_REP_COD) GROUP BY INT_REP;//此语句出错:

这句是不是就是下面的意思?
oldEND := :old.SUB_END*:old.INT_DEB_CRE;
minkoming 2003-05-27
  • 打赏
  • 举报
回复
修改触发起吧,重新编译一次。
jiezhi 2003-05-27
  • 打赏
  • 举报
回复
触发器有问题.

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧