高手帮忙,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中插入一条就报这个错误呢。这个问题希望高手也能解答下。
...全文
121 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
触发器是系统原来写好的,验证数据段的,我不能删,只能想别的办法了。
谢谢楼上的回答。
阿冷 2012-06-29
  • 打赏
  • 举报
回复
个人认为,触发器这个问题,确实比较让人头疼。
PRAGMA AUTONOMOUS_TRANSACTION
是增加了一个内部的自治事务,原则上来说,不是太好,毕竟中间该提交的,该返回的,都做完了,外边的事务控制不了。
其实就楼主这个需求来讲,不用触发器,也比较容易实现,那就是,插入之前,去数据库select一次,看看。

3,494

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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