2016-07-28 43 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; 

を取得し、正しい値問題なく作成するようですあなたに入っているようです引き金。それから私は私が間違っているつもりだところ誰が見るん

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

を取得

SELECT SEQ,UID FROM TABLE2 WHERE SEQ = 47; 

とを実行することにより、TABLE2をチェック!

+1

あなたはROLLBACKをしましたか?つまり、COMMITを忘れましたか? –

+0

これは同じセッションです。私は後でコミットを実行しようとしましたが、確かにそうです。 – user1958756

答えて

6

これは本当にあなたのコードの場合は、文の

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

table2の列ではなく、同じ名前のローカル変数にsequidを解決します。したがって、すべての行をtable2に更新し、uidの値を既存の値に設定しています。最も簡単な解決策は、ローカル変数が名前と競合しないように名前を変更することです。私はあなたにもローカル変数にするこれらの参照を強制的にトリガ名でsequidを修飾する可能性が信じている

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; 

l_接頭辞を使用すると思います。トリガでそれを試したことはありませんが、プロシージャや関数などの他の名前付きPL/SQLブロックと同じように動作するはずです。しかし、私はむしろ私のローカル変数の名前を変更したいと思う。

関連する問題