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