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求解,求正确的触发器写法,谢谢
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;
把
update goods set saler='1' where :new.id=:old.id;
改成
select '1' into :N.saler from dual;
就ok了
怎么跟 表结构没关系。。
你trigger里面 update 表 set 列=值
如果你这个表里面没得这个列 你怎么操作。如果你当前用户对你trigger里面操作的表没得修改权限你怎么操作?
这个触发器是可以更新的 create trigger dele_insert
after insert or delete on trade
for each row
begin
if inserting then
update goods set counts=(counts+1) where id=:old.g_id;
elsif deleting then
update goods set counts=(counts-1) where id=:old.g_id;
end if;
end;
/,
所以我怀疑我的触发器写的不对,