我在尝试在Oracle SQL上触发时遇到了很多麻烦......
这是我的问题:
- 我有一个包含值0-10的表X和一个包含一组X ID的此值的平均值的表Y.所以我必须触发一个重新计算我正在插入删除或更新的ID的平均值
什么基本上我正在做和运气......:
CREATE or REPLACE trigger Update_Average
after insert or update or delete on X
DECLARE
holdID X.ID%type;
Avrg Y.Average%type;
BEGIN
holdID := X.ID;
select avg(value)
into Avrg
from X
where X.id = holdID;
update Y
set Average = Avrg
where Y.id = holdID;
END;
答案 0 :(得分:1)
我认为你可以做到:
begin
update Y
set average = (select avg(value) from x where x.id = :new.id)
where y.id = :new.id;
end
编辑:
Oracle对于更新触发器中正在修改的表非常繁琐。就个人而言,我想通过在Y
中存储两个值 - 总和和计数来避免这个问题。然后,触发器看起来像:
begin
update Y
set sum = (sum + (case when :new.id is not null then :new.value else 0 end) -
(case when :old.id is not null then :old.value else 0 end))
cnt = (cnt + (case when :new.id is not null then 1 else 0 end) -
(case when :old.id is not null then 1 else 0 end))
where y.id = :new.id;
end
注意:为了便于将其放在一个语句中,这将检查NULL
的值,而不是使用if DELETING
。我非常确定Oracle会在删除触发器中返回NULL
之类的:NEW
记录。