oracle ORA-04091:表xyz.xyz正在发生变化,触发器/函数可能看不到它

ztigrdn8  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(139)

因此,我创建了一个触发器,如果它为空,它将更新表中的数据。

CREATE OR REPLACE TRIGGER "XDA.GUID"
AFTER INSERT ON "TEST_GUID" 
FOR EACH ROW
BEGIN
    IF :NEW.GUID IS NULL THEN
        UPDATE "TEST_GUID"
        SET GUID = SYS_GUID()
        WHERE ID = :NEW.ID;
        ROLLBACK;
    END IF;
END;

我需要更新相同的表插入后执行该表。
现在我在努力表演

INSERT INTO TEST_GUID (ID, GUID)
VALUES (2, '');

那我就低于误差了。

Error starting at line : 2 in command -
INSERT INTO TEST_GUID (ID, GUID)
VALUES (2, '')
Error report -
ORA-04091: table SYSTEM.TEST_GUID is mutating, trigger/function may not see it
ORA-06512: at "SYSTEM.XDA.GUID", line 3
ORA-04088: error during execution of trigger 'SYSTEM.XDA.GUID'

请提出解决方案。

5us2dqdw

5us2dqdw1#

只是

CREATE OR REPLACE TRIGGER "XDA.GUID"
BEFORE INSERT ON "TEST_GUID" 
FOR EACH ROW
BEGIN
  :new.guid := nvl(:new.guid, sys_guid());
END;

顺便问一句,你为什么要把它倒回去?那么那个扳机就一点用也没有了。

qltillow

qltillow2#

您可以用途:

CREATE OR REPLACE TRIGGER "XDA.GUID"
  BEFORE INSERT ON TEST_GUID
  FOR EACH ROW
  WHEN (NEW.guid IS NULL)
BEGIN
  :NEW.guid := sys_guid();
END;
/

仅对NULL值运行触发器。(* 注意:在Oracle中,''NULL是相同的。
fiddle

相关问题