高手帮忙,oracle触发器问题

就是一个昵称嘛 2012-06-29 02:45:46
向表中插入数据时,表上有触发器,爆出如下错误:
ora-04091 table TASK_FLOW_LOG is mutating, trigger/function may not see it

这是我的触发器

create or replace trigger "TRG_TASK_FLOW_LOG"
before insert on task_flow_log
for each row
declare
I_count integer;
data_unique_exception exception;
begin

if :new.seq is null then
raise data_unique_exception;
end if;

----如果还在待审核状态,不能做其他插入操作
select count(1)
into I_count
from task_flow_log
where task_info_id = :new.task_info_id --这句select报错
and state = 'T0';
if I_count > 0 then
raise data_unique_exception;
end if;


end TRG_TASK_FLOW_LOG;

这是我的insert语句。

insert into task_flow_log values ('AUTO',14776306,3,'08300002',sysdate,sysdate,1,5);

目前找到的解决方法是修改触发器,添加如下语句,但是这种做法可能会导致死锁。
PRAGMA AUTONOMOUS_TRANSACTION;

有没有高手还有更好的方法。
为什么web程序每天插都没事,我在plsql中插入一条就报这个错误呢。这个问题希望高手也能解答下。
...全文
75 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
触发器是系统原来写好的,验证数据段的,我不能删,只能想别的办法了。
谢谢楼上的回答。
回复
阿冷 2012-06-29
个人认为,触发器这个问题,确实比较让人头疼。
PRAGMA AUTONOMOUS_TRANSACTION
是增加了一个内部的自治事务,原则上来说,不是太好,毕竟中间该提交的,该返回的,都做完了,外边的事务控制不了。
其实就楼主这个需求来讲,不用触发器,也比较容易实现,那就是,插入之前,去数据库select一次,看看。
回复
相关推荐
发帖
Oracle 高级技术
创建于2007-09-28

3427

社区成员

Oracle 高级技术相关讨论专区
申请成为版主
帖子事件
创建了帖子
2012-06-29 02:45
社区公告
暂无公告