2013-10-10 28 views
0

我創建了觸發器來在插入後更新oracle數據庫表。如何避免獲取ORACLE突變觸發器錯誤

CREATE OR REPLACE TRIGGER Update_ACU  
    AFTER INSERT ON TBL_ACU  
    FOR EACH ROW  
BEGIN  
    UPDATE TBL_ACU  
    SET CURRENCY = 'XXX'  
    WHERE ACCOUNT like '%1568'; 
END ; 


I inserted record as 

insert into TBL_ACU values('23','USD','1231568'); 

我得到表ORACLE突變觸發器錯誤。

請幫我解決這個問題。

+2

所以插入任何一行之後,你希望那有1568結尾有自己的貨幣設置爲「XXX」賬戶中的所有行?這是一個真正的要求? –

+0

是的,你是對的。 – user2866268

回答

0

那麼,如果修改該表後調用觸發器,則無法修改觸發器中的表。對於這個問題,包括在PL/SQL包中定義的集合的AFTER STATEMENT觸發和緩存修改的各種解決方案,howewer在你的情況,我寧願你觸發的身體改成這樣:

BEGIN 
    IF :NEW.ACCOUNT LIKE '%1568' THEN 
     :NEW.CURRENCY := 'XXX'; 
    END IF; 
END; 

你可以使用觸發器內部的:NEW:OLD變量,其相應地識別新的舊的記錄的值。修改:NEW記錄的值將導致實際插入數據庫的數據發生更改。

+0

您在爲貨幣分配新值時錯過了':'。 – Dba

+0

@Dba太多的java會殺了你,他們說;)謝謝,糾正。 – npe

0

最好用BEFORE INSERT觸發器來做到這一點。

嘗試這樣,

CREATE OR REPLACE 
TRIGGER update_acu 
    BEFORE INSERT ON tbl_acu 
    FOR EACH ROW 
    WHEN (NEW.ACCOUNT LIKE '%1568') 
BEGIN 
    :NEW.currency := 'XXX'; 
END ; 
+0

是什麼時候(NEW.ACCOUNT LIKE'%1568') 我想你錯過了':'之前NEW。 何時(:NEW.ACCOUNT LIKE'%1568') 如果我錯了,請糾正我。 – user2866268

+0

是的,在插入之前它會檢查這個。 – Dba

+0

不,語法是正確的。你可以嘗試一下。 – Dba