日期:2014-05-17  浏览次数:20827 次

新手请教2:关于简单的oracle触发器,求解惑,谢谢!
goods货物表,字段id主键,price价格,counts销售数量,saler 是否是热销商品
trade交易记录表,字段id主键,g_id货物标识。

现在往trade表中插入一条数据,则会更新goods表中对应g_id的id的counts,
SQL> create trigger dele_insert
  2 after insert or update on trade
  3 for each row
  4 begin
  5 if inserting then
  6 update goods set counts=(counts+1) where id=:old.g_id;
  7 elsif deleting then
  8 update goods set counts=(counts-1) where id=:old.g_id;
  9 end if;
 10 end;
 11 /

现在想实现如果goods 对应的counts>30,则自动更新saler为1,标识热销商品。
自己写的触发器为:
 create trigger upsaler
 after update on goods
 for each row
 begin
 case
 when updating('counts') then
 if :new.counts>10
 then 
 update goods set saler='1' where :new.id=:old.id;
 end if;
 end case;
 end;
 /
但是往trade插入数据时,抛出异常
第 1 行出现错误:
ORA-04091: 表 SYSTEM.GOODS 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "SYSTEM.UPSALER", line 6
ORA-04088: 触发器 'SYSTEM.UPSALER' 执行过程中出错
ORA-06512: 在 "SYSTEM.G_T", line 2
ORA-04088: 触发器 'SYSTEM.G_T' 执行过程中出错
ORA-06512: 在 line 5

求解,求正确的触发器写法,谢谢

------解决方案--------------------

SQL code

--我把你的触发器拿来编译了 编译成功。。
--我建了一张goods表
create table goods
 (
 id varchar2(10),
 counts number,
 saler varchar2(10)
 )
--估计你使用的表结构产生了变化
--你检查下你的表中这三个字段是否都还在
--然后根据你的错误信息你的表是在system用户下
--如果你用的其他用户登陆操作不了这些表

------解决方案--------------------
SQL code

--有上面的表的情况下,下面这个触发器 编译是不会报错的,也就是你写的一模一样
create trigger upsaler
 after update on goods
 for each row
 begin
 case
 when updating('counts') then
 if :new.counts>10
 then  
 update goods set saler='1' where :new.id=:old.id;
 end if;
 end case;
 end;

------解决方案--------------------
探讨
引用:

SQL code

--有上面的表的情况下,下面这个触发器 编译是不会报错的,也就是你写的一模一样
create trigger upsaler
after update on goods
for each row
begin
case
when updating('counts') then
if :new.counts>10
then
upd……