欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

请各位大侠帮看一上这个oracle触发器那里出错了

更新时间: 2014-01-05 02:16:29 责任编辑: Author_N1

 

请各位大侠帮看一下这个oracle触发器那里出错了
create or replace trigger test1
after insert or update or delete
on libfile2
for each row
--declare
-- PRAGMA AUTONOMOUS_TRANSACTION;
begin
 if deleting then
  declare
  vol_ownervol libvol2.keyword%type;
  file_keyword libfile2.keyword%type;
  begin
    select :old.ownervol into vol_ownervol from dual;
 -- select :old.keyword into file_keyword from dual;

  update libvol2  set f2=(select sum(f8) from libfile2 where ownervol=vol_ownervol),f3=(select count(*) from libfile2 where ownervol=vol_ownervol) where libvol2.keyword = vol_ownervol;

--commit;
 end;

 else
 declare
 vol_ownervol libvol2.keyword%type;
 file_keyword libfile2.keyword%type;

   begin  
   select :new.ownervol into vol_ownervol from dual;
 --select :new.keyword into file_keyword from dual;
    update libvol2  set f2=(select sum(f8) from libfile2 where ownervol=vol_ownervol),f3=(select count(*) from libfile2 where ownervol=vol_ownervol) where libvol2.keyword = vol_ownervol;

--commit;
end;
end if;
end;
能正常编译;但触发时出错:ora-04091 表xx发生了变化,触发器/函数不能读它
--参考方法--
可能是触发器中的逻辑在触发器本身还没有执行完时,又导致了重新触发;
你  update libvol2  ,是否在libvol2 也有触发器,导致更改 libfile2。
--参考方法--
和触发器无关,是你的逻辑没理清。

举个最简单例子:我修改某列数据时,要求这数值不能大于此列平均值,那么我计算平均数时包含了当前行,那我应该取何时的数据?这和Oracle的事务处理逻辑有关。

1 用你注释掉的自治事务处理

2 把逻辑改正。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:16:29
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/7836/
本文WWW.DOC100.NET DOC100.NET版权所有。