【问题标题】:How to update a table with a trigger如何使用触发器更新表
【发布时间】:2022-11-17 00:55:06
【问题描述】:

我正在尝试创建一个从表 2 读取并更新表 1 中的列的触发器。 我尝试使用此方法但发生异常: ORA-04091:table table1 is mutating 。

CREATE OR REPLACE TRIGGER "TRG1"
AFTER INSERT OR UPDATE ON table1
FOR EACH ROW
 BEGIN
 UPDATE table1 SET name =(SELECT name FROM table2
WHERE table1.id = table2.id);
 END;

【问题讨论】:

标签: sql oracle triggers


【解决方案1】:

您只能在触发器之前更新名称

CREATE OR REPLACE TRIGGER "TRG1"
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
 BEGIN
   if nvl(:old.name, '-1') <> nvl(:new.name, '-1') then
     :new.name =(SELECT name FROM table2
        WHERE :new.id = table2.id);
   end if;
 END;

【讨论】:

  • 触发器中的语法无效,因为赋值是 :=,您不能在没有 INTO 子句 fiddle 的 PL/SQL 中使用 SELECT 语句。
【解决方案2】:

使用 BEFORE UPDATE 触发器(因为在插入或更新值后无法修改值)并使用 :NEW 记录(而不是尝试更新表并进入触发器的无限循环):

CREATE OR REPLACE TRIGGER TRG1
  BEFORE INSERT OR UPDATE ON table1
  FOR EACH ROW
BEGIN
  SELECT name
  INTO   :NEW.name
  FROM   table2
  WHERE  :NEW.id = id;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    :NEW.name := NULL;
END;
/

fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多