新手请教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
求解,求正确的触发器写法,谢谢
[解决办法]
--我把你的触发器拿来编译了 编译成功。。--我建了一张goods表create table goods ( id varchar2(10), counts number, saler varchar2(10) )--估计你使用的表结构产生了变化--你检查下你的表中这三个字段是否都还在--然后根据你的错误信息你的表是在system用户下--如果你用的其他用户登陆操作不了这些表
[解决办法]
--有上面的表的情况下,下面这个触发器 编译是不会报错的,也就是你写的一模一样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;
[解决办法]