我正在嘗試創建觸發器以在創建或更新記錄后更新記錄的某些列。
那里有我的代碼:
CREATE OR REPLACE TRIGGER "TRIGGER_UPDATE_CONTRACTOR_LOT"
AFTER INSERT OR UPDATE ON "CONTRACTOR_LOT"
FOR EACH ROW
DECLARE
CONTRACT_LOT_LABEL VARCHAR2(255 BYTE);
CONTRACTOR_LABEL VARCHAR2(200 BYTE);
BEGIN
SELECT LABEL INTO CONTRACT_LOT_LABEL FROM LOT_T WHERE ID = :NEW.LOT_ID;
SELECT CONTRACTOR INTO CONTRACTOR_LABEL FROM CONTRACTOR_T WHERE ID = :NEW.CONTRACTOR_ID;
UPDATE CONTRACTOR_LOT
SET LABEL = CONTRACT_LOT_LABEL || ':' || CONTRACTOR_LABEL,
FRAMEWORK_CONTRACT_NUMBER_LABEL = :NEW.ORDER || ':' || CONTRACT_LOT_LABEL || :NEW.FRAMEWORK_CONTRACT_NUMBER
WHERE ID = :NEW.ID;
END;
我收到錯誤 ORA-04091(突變)我嘗試添加PRAGMA AUTONOMOUS_TRANSACTION;并收到錯誤 ORA-00060(在等待資源時檢測到死鎖)所以我COMMIT;在更新后添加,但它仍然是同一個問題。
你能幫我嗎?
uj5u.com熱心網友回復:
您不能在觸發器內對父表執行 DML,而且幾乎沒有任何理由這樣做。試試這個,使用BEFORE觸發器并僅修改NEW現有值INSERT或UPDATE觸發觸發器的值:
CREATE OR REPLACE TRIGGER TRIGGER_UPDATE_CONTRACTOR_LOT
BEFORE INSERT OR UPDATE ON CONTRACTOR_LOT
FOR EACH ROW
DECLARE
CONTRACT_LOT_LABEL VARCHAR2(255 BYTE);
CONTRACTOR_LABEL VARCHAR2(200 BYTE);
BEGIN
SELECT LABEL INTO CONTRACT_LOT_LABEL FROM LOT_T WHERE ID = :NEW.LOT_ID;
SELECT CONTRACTOR INTO CONTRACTOR_LABEL FROM CONTRACTOR_T WHERE ID = :NEW.CONTRACTOR_ID;
:NEW.CONTRACTOR_LOT := CONTRACT_LOT_LABEL || ':' || CONTRACTOR_LABEL;
:NEW.FRAMEWORK_CONTRACT_NUMBER_LABEL := :NEW.ORDER || ':' || CONTRACT_LOT_LABEL || :NEW.FRAMEWORK_CONTRACT_NUMBER;
END;
uj5u.com熱心網友回復:
您的觸發器正在捕獲此表上的更改和插入,然后在同一個表上進行更新。這似乎是一個惡性回圈。因為觸發器內部的更新也將要啟動此觸發器
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522707.html
標籤:甲骨文触发器突变
上一篇:SQLOracle同類比較
