2016-07-28 6 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

같은 세션입니다. 나중에 COMMIT를 실행 해 보았습니다. – user1958756

답변

6

이 정말 코드, table2의 열을

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

sequid 해결 문이 아니라 같은 이름의 지역 변수 인 경우. 따라서 모든 행을 table2으로 업데이트하고 uid 값을 기존 값으로 설정합니다. 가장 간단한 해결책은 지역 변수의 이름을 변경하여 식별자와 충돌하지 않도록하는 것입니다. 나는 당신이 또한 로컬 변수로 이러한 참조를 강제로 트리거 이름으로 sequid을받을 수 믿는 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; 

을 사용하십시오. 방아쇠로 시도하지는 않았지만 프로 시저 및 함수와 같은 다른 명명 된 PL/SQL 블록과 동일한 방식으로 작동해야합니다. 하지만 내 로컬 변수의 이름을 바꾸는 편이 낫다.

관련 문제