关于触发器的问题(变异表)
触发器查询其自己的触发表(该表为变异表),导致有错误发生"Table nn is mutating,trigger/function may not see it."
于是我采用两个触发器来解决:一个行触发器(不带查询),一个语句触发器,和一个包(PAKAGE)来保存更新的值。
由于我不清楚是否有容器能同时放包和两个触发器,所以我在包里建了这个包,在触发器里建了这两个触发器。
但是在更新表时,触发器出错:“existing state of packages has been discarded.”
请问发生了什么错误,如何解决??或者是否有其他方法解决变异表错误??
问题点数:50、回复次数:5Top
1 楼beckhambobo(beckham)回复于 2003-09-03 16:16:47 得分 20
所以我在包里建了这个包,在触发器里建了这两个触发器??
怎样做法,能否把代码也写出来Top
2 楼maxwellqhq()回复于 2003-09-04 16:47:02 得分 0
TO bechhambobo
其实问题是这样的:
假设一个触发器是针对表A变动而能使得表B也发生相应的变动。则在触发器体内一定是一些对表B进行的执行语句。
我现在的问题是这些执行语句涉及到查询表A的记录数据,这样的话会产生“mutating”、
(变异)而发生错误。
我现在没办法解决这个问题,因为我必须还要返回来查询表A里面其他的数据,然后结合表A里新增的数据(或删除)一起再做些动作。
请问有什么想法和解决办法吗?
非常感谢!!!!!Top
3 楼beckhambobo(beckham)回复于 2003-09-04 19:00:45 得分 0
create trigger a_tri
before insert or update on a
for each row
declare
cursor t_sor is
select ... from a;
begin
for v_sor in t_sor loop
...
end loop;
update b set=... where id=:new.id;
end;
/Top
4 楼BlueskyWide(谈趣者)回复于 2003-09-04 19:25:00 得分 30
"我现在的问题是这些执行语句涉及到查询表A的记录数据,这样的话会产生mutating",
是的,无论如何要避免针对A表的变动再去"查询A表",即不要再出现A表的名字,
但可以用其它方法引用A表中的字段,如使用decode等.Top
5 楼maxwellqhq()回复于 2003-09-05 10:58:14 得分 0
TO BlueskyWide:
"但可以用其它方法引用A表中的字段,如使用decode等"
decode是怎么使用的?你能说详细点吗?我没接触过。其他的一些方法你帮我介绍一下好吗,谢谢!!!!Top




