【问题标题】:table EMP is mutating, trigger/function may not see it error表 EMP 正在变异,触发器/函数可能看不到它错误
【发布时间】:2021-03-31 10:32:11
【问题描述】:

我的 apex oracle 数据库中有一个表 EMP,其中包含名为 sal 的薪金属性。我有另一个表 EMPSAL,它有 3 个名为 averageSal、minSal、maxSal 的属性,每当对 EMP 表的 sal 列执行任何 DML 操作时,都将使用触发器更新这些属性。这是用于升级的触发器:

create or replace trigger empsal_update_trigger
AFTER update on emp
for each row
declare
avgSal2 emp.sal%type;
minSal2 emp.sal%type;
maxSal2 emp.sal%type;
begin
select avg(sal), min(sal), max(sal) into avgSal2, minSal2, maxSal2 from emp;
delete from empsal;
insert into empsal values(avgSal2, minSal2, maxSal2);
end;

插入和删除触发器工作正常,但上面给出的更新在 EMPSAL 中更新 A 记录时会出错。我试过用before关键字代替after,但是没用。

【问题讨论】:

  • “更新上面给出的错误” - 什么错误?请edit在正文中完整引用。
  • 您正在尝试从 emp 中选择所有记录,同时在触发器中更新它。你不能那样做。每次触发器触发时,您也会删除 empsal 中的每一行。我建议阅读documentation
  • 标题中提到了错误。
  • 请求是在问题正文中完整引用错误。不要试图缩写或解释它,显示一个实际的示例查询以及该查询给你的确切错误消息。
  • 与其使用触发器,不如将 EMPSAL 设为物化视图并由内置数据库功能自动维护。

标签: sql oracle plsql triggers


【解决方案1】:

对于这种情况,您不需要 行级别 触发器,而是使用 语句级别 触发器。甚至不需要通过使用INSERT INTO ... SELECT...语句来定义局部变量。

所以,只要去掉FOR EACH ROW之类的

CREATE OR REPLACE TRIGGER empsal_update_trigger AFTER UPDATE ON emp
BEGIN
  DELETE empsal;
  INSERT INTO empsal
  SELECT AVG(sal), MIN(sal), MAX(sal)
    FROM emp;
END;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2010-09-27
    • 2013-11-24
    • 2016-08-11
    相关资源
    最近更新 更多