Oracle11g 表正在变化,触发器/函数可能看不到它

Oracle11g 表正在变化,触发器/函数可能看不到它,oracle11g,Oracle11g,我创建了一个触发器来检查计数 create or replace TRIGGER TEST_TRG before INSERT OR UPDATE ON TEST REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE AVAILABLE INTEGER; BEGIN IF UPDATING THEN IF(:new.STATUS = 600 OR :new.STATUS = 700) THEN SELECT COUNT(1

我创建了一个触发器来检查计数

create or replace
TRIGGER TEST_TRG before INSERT OR UPDATE ON TEST
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE 
  AVAILABLE INTEGER;
BEGIN
IF UPDATING THEN
  IF(:new.STATUS = 600 OR :new.STATUS = 700) THEN
    SELECT COUNT(1) INTO AVAILABLE FROM TEST T WHERE T.IDDISPLAY = :new.IDDISPLAY 
      AND T.STATUS NOT IN (600,700);
    IF(AVAILABLE = 0) THEN
      InsertOrUpdateAnotherTable(:new.IDDISPLAY, :new.STATUS, 0);
    ELSE
      RETURN;
    END IF;
  END IF;
END IF;
在我将测试表中的状态更改为600后,出现了错误

ORA-04091: table USER.TEST is mutating, trigger/function may not see it
ORA-06512: at "USER.TEST_TRG ", line 8
ORA-04088: error during execution of trigger 'USER.TEST_TRG'
如果满足条件,我将插入或更新另一个表

错误是因为当触发器触发同一个表时,我试图获取当前表的计数。这将导致突变发生

我尝试了事务_匿名和复合触发器,但最后还是出现了相同的错误

任何人都可以帮我找到另一个解决方案

首先:

这是底线

IF(AVAILABLE = 0) THEN
即使您可以消除变异错误,也永远不会到达。 像这样检查count:count(1)到AVAILABLE将在您确实没有查询的记录时抛出异常“no data found”

第二: 在每行后面使用compund trigger和section可以避免像Tom所写的那样发生变异:

试试这个:

create or replace
TRIGGER TEST_TRG FOR INSERT OR UPDATE ON TEST
COMPOUND TRIGGER

AVAILABLE INTEGER;

AFTER EACH ROW IS
BEGIN
IF UPDATING THEN
 IF(:new.STATUS = 600 OR :new.STATUS = 700) THEN

  BEGIN
    SELECT COUNT(1) INTO AVAILABLE FROM TEST T WHERE T.IDDISPLAY = :new.IDDISPLAY 
    AND T.STATUS NOT IN (600,700);
  EXCEPTION 
WHEN NO_DATA_FOUND THEN
  InsertOrUpdateAnotherTable(:new.IDDISPLAY, :new.STATUS, 0);
  END;

 END IF;
END IF;
END AFTER EACH ROW;
END TEST_TRG;

您试图解决的业务问题是什么?为什么需要查询表中的行而不是正在插入或更新的行?表中各行之间的依赖关系几乎总是表示数据模型存在潜在问题。很抱歉误解。表中可能有多个IDDISPLAY,我需要确保IDDISPLAY的所有状态都是600或700,只有我将插入/udpate另一个表@JustinCave