2016-07-28 193 views
1

我已經運行此代碼來創建此觸發器,因爲我需要使用插入到TABLE1中的具有相同序列號的行的UID值更新TABLE2。Oracle觸發器不更新

CREATE OR REPLACE TRIGGER TRIG_NAME BEFORE INSERT ON TABLE1 FOR EACH ROW 
DECLARE 
    seq NUMBER(10); 
    uid CHAR(36); 
    BEGIN 
    seq := :new.SEQ; 
    uid := :new.UID; 
    UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq; 
    DBMS_OUTPUT.put_line('UPDATE TABLE2 SET UID = '||uid||' WHERE SEQ = '||seq||';'); 
END; 

觸發似乎產生了沒有問題,所以我

SET SERVEROUTPUT ON; 

然後

INSERT INTO TABLE1 (SEQ, UID) VALUES (47, 'TEST_VALUE'); 

,並得到預期的輸出

UPDATE TABLE2 SET UID = TEST_VALUE       WHERE SEQ = 47; 

所以,正確的價值觀似乎正在進入觸發。然後我檢查TABLE2運行

SELECT SEQ,UID FROM TABLE2 WHERE SEQ = 47; 

,並得到

SEQ UID         
--- ------------------------------------ 
47          
1 row selected. 

有誰看到我要去哪裏錯了嗎?

+1

你做了一個ROLLBACK,即你忘了COMMIT嗎? –

+0

這是同一屆會議。儘管如此,我已經試過運行一個COMMIT,只是可以肯定的。 – user1958756

回答

6

如果這真的是你的代碼,該語句

UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq; 

解決sequid到列table2而不是同名的局部變量。因此,您正在更新table2中的每一行,並將uid值設置爲現有值。最簡單的解決方案是重命名您的本地變量,以便它們不與任何標識符衝突。我會使用一個l_前綴

DECLARE 
    l_seq NUMBER(10); 
    l_uid CHAR(36); 
    BEGIN 
    l_seq := :new.SEQ; 
    l_uid := :new.UID; 
    UPDATE TABLE2 SET TABLE2.UID = l_uid WHERE TABLE2.SEQ = l_seq ; 
    DBMS_OUTPUT.put_line('UPDATE TABLE2 SET UID = '||l_uid ||' WHERE SEQ = '||l_seq ||';'); 
    END; 

我相信你也有資格在sequid與觸發器名,迫使這些引用是局部變量。從未嘗試過使用觸發器,但它的工作方式與其他命名PL/SQL塊(如過程和函數)的工作方式相同。但我寧願重命名我的本地變量。