오라클 트리거 변수에 할당된 값 변경하는 방법 0 3 4,670

by 지구촌아이 [Oracle 기초] trigger 트리거 [2017.07.20 09:50:43]


CREATE OR REPLACE TRIGGER TR_MC_MEMBER
AFTER UPDATE ON MC_MEMBER
FOR EACH ROW
    DECLARE conts VARCHAR2(500):='';
BEGIN    
    IF :OLD.EMAIL != :NEW.EMAIL THEN
        conts := conts || '<p>이메일 : ' || :NEW.EMAIL || '</p>';
    END IF;    
    IF :OLD.TEL != :NEW.TEL THEN
        conts := conts || '<p>전화번호 : ' || :NEW.TEL || '</p>';
    END IF;
    IF :OLD.CELL != :NEW.CELL THEN
        conts := conts || '<p>휴대전화 : ' || :NEW.CELL || '</p>';
    END IF;
    IF :OLD.MEMBER_PW != :NEW.MEMBER_PW THEN
        conts := conts || '<p>패스워드 변경</p>';
    END IF;
    IF :OLD.GROUP_SEQ != :NEW.GROUP_SEQ THEN
        conts := conts || '<p>부서이동</p>';
    END IF;
    IF conts is null or conts='' THEN    
        conts := '<p>기타정보 변경</p>';
    END IF;
    IF :OLD.LAST_LOGIN != :NEW.LAST_LOGIN THEN
        conts := 'X';
    END IF;
    
    IF conts != 'X' THEN    
    INSERT INTO MC_MEMBER_HISTORY(
        SEQ, MEMBER_ID, MEMBER_NM, CONTS, MOD_ID, MOD_NM, MOD_DT, MOD_IP
    ) VALUES(
        SEQ_MC_MEMBER_HISTORY.NEXTVAL, :NEW.MEMBER_ID, :NEW.MEMBER_NM, conts, :NEW.MOD_ID, :NEW.MOD_NM, :NEW.MOD_DT, :NEW.MOD_IP
    );
    END IF;
    
END TR_MC_MEMBER;

 

위와같이 트리거 를 작성하였습니다.

근데 conts 변수를 ''으로 초기화해주고 위에 한번 if문조건에 들어갈경우 첫번째 할당된 값을 다른값으로 변경이 안됩니다.

||으로 이어붙이기는 되는데 재할당이 안되는거 같습니다. 왜그런걸까요?

by 마농 [2017.07.20 10:16:03]

"재할당이 안된다"는 표현의 의미를 모르겠네요?
딱히 안될 이유는 없습니다.

어느 부분에서 안되는 건지? 뭐가 어떻게 안되는 건지?
어떤 특정 값으로 부터 이런 결과를 기대했지만 다른 결과가 나왔다.
식의 구체적인 설명을 해주세요.


by 지구촌아이 [2017.07.20 10:40:04]

제가 착각하였습니다. 두번의 update가 있었네요.

다시 다른질문을 하자면

CREATE OR REPLACE TRIGGER TR_MC_MEMBER
AFTER UPDATE ON MC_MEMBER
FOR EACH ROW
    DECLARE conts VARCHAR2(500) := '';
BEGIN    
    IF :OLD.EMAIL != :NEW.EMAIL THEN
        conts := conts || '<p>이메일 : ' || :NEW.EMAIL || '</p>';
    END IF;    
    IF :OLD.TEL != :NEW.TEL THEN
        conts := conts || '<p>전화번호 : ' || :NEW.TEL || '</p>';
    END IF;
    IF :OLD.CELL != :NEW.CELL THEN
        conts := conts || '<p>휴대전화 : ' || :NEW.CELL || '</p>';
    END IF;
    IF :OLD.MEMBER_PW != :NEW.MEMBER_PW THEN
        conts := conts || '<p>패스워드 변경</p>';
    END IF;
    IF :OLD.GROUP_SEQ != :NEW.GROUP_SEQ THEN
        conts := conts || '<p>부서이동</p>';
    END IF;
    
    IF conts <> '' THEN    
    INSERT INTO MC_MEMBER_HISTORY(
        SEQ, MEMBER_ID, MEMBER_NM, CONTS, MOD_ID, MOD_NM, MOD_DT, MOD_IP
    ) VALUES(
        SEQ_MC_MEMBER_HISTORY.NEXTVAL, :NEW.MEMBER_ID, :NEW.MEMBER_NM, conts, :NEW.MOD_ID, :NEW.MOD_NM, :NEW.MOD_DT, :NEW.MOD_IP
    );
    END IF;
    
END TR_MC_MEMBER;

 

이런 트리거가 있으면 conts가 ''이 아닐경우만 히스토리를 쌓는 트리거를 작성하였는데 

전화번호나 이메일을 변경하였을때 히스토리테이블에 이메일,전화번호 가 어떻게 변경되었는지 쌓여야하는데 안쌓입니다. 무엇이 잘못되었을까요?


by 마농 [2017.07.20 11:06:09]

오라클에서는 다른 언어와 다르게 '' 을 null 로 인지합니다.
Null 은 비교연산이 불가능하구요.
conts <> '' 조건은 널 비교 연산으로 참이 될 수 없습니다.
conts IS NOT NULL 로 바꾸셔야 합니다.

추가로.
IF :OLD.EMAIL != :NEW.EMAIL THEN
이 조건의 경우 기존 값이 있었는데 바뀐 경우라면 체크가 됩니다만
기존 값이 없었는데 새로 들어온 경우라면 체크가 안됩니다.
마찬가지 이유입니다. 기존값이 null 이므로 비교가 안됩니다.
IF NVL(:OLD.EMAIL, 'x') != NVL(:NEW.EMAIL, 'x') THEN 해야 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입