【问题标题】:table is mutating trigger cannot see ittable is mutating trigger 看不到它
【发布时间】:2016-03-07 08:26:51
【问题描述】:

我有一张这样的桌子......

create table grades (id number, t1 number, t2 number, t3 number, mark number);

我想要一个触发器来计算和更新表格,其中包含受影响的每一行的平均标记。

所以我写了一个这样的触发器......

create or replace trigger rades_trg 
after insert 
on grades
for each row
declare 
v_mark grades.mark%type;
begin
v_mark := (:new.t1 + :new.t2 + :new.t3) / 3;
update grades set mark = v_mark where id = :new.id;   
dbms_output.put_line(v_mark); 
end; 
/ 

然后我像这样输入一条新记录...

insert into grades (id, t1, t2, t3) values (5, 100, 100, 25);

但是 oracle 告诉我该表可能正在发生变化,并且触发器无法看到它。

【问题讨论】:

  • 有什么理由不想使用虚拟列或视图,而不是存储冗余数据?
  • 希望dbms_output.put_line 仅用于调试目的。否则您可能会收到 ORA-20000: ORU-10027 错误。

标签: sql oracle triggers insert


【解决方案1】:

通常不允许行触发器查询或修改声明它们的表。要解决这个问题,我建议您将触发器设置为 BEFORE 触发器,这样您就可以在触发器中简单地设置 :new.mark

create or replace trigger rades_trg 
  before insert on grades
  for each row
begin
  :new.mark := (:new.t1 + :new.t2 + :new.t3) / 3;
  dbms_output.put_line(:new.mark); 
end;

祝你好运。

【讨论】:

  • 最好没有触发器。只是列MARK GENERATED ALWAYS AS ((t1+t2+t3)/3) VIRTUAL
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 2011-10-18
  • 2023-01-26
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多