首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

新手请问2:关于简单的oracle触发器,求解惑,多谢

2012-08-08 
新手请教2:关于简单的oracle触发器,求解惑,谢谢!goods货物表,字段id主键,price价格,counts销售数量,saler

新手请教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……

热点排行