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문조건에 들어갈경우 첫번째 할당된 값을 다른값으로 변경이 안됩니다.
||으로 이어붙이기는 되는데 재할당이 안되는거 같습니다. 왜그런걸까요?
제가 착각하였습니다. 두번의 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가 ''이 아닐경우만 히스토리를 쌓는 트리거를 작성하였는데
전화번호나 이메일을 변경하였을때 히스토리테이블에 이메일,전화번호 가 어떻게 변경되었는지 쌓여야하는데 안쌓입니다. 무엇이 잘못되었을까요?
오라클에서는 다른 언어와 다르게 '' 을 null 로 인지합니다.
Null 은 비교연산이 불가능하구요.
conts <> '' 조건은 널 비교 연산으로 참이 될 수 없습니다.
conts IS NOT NULL 로 바꾸셔야 합니다.
추가로.
IF :OLD.EMAIL != :NEW.EMAIL THEN
이 조건의 경우 기존 값이 있었는데 바뀐 경우라면 체크가 됩니다만
기존 값이 없었는데 새로 들어온 경우라면 체크가 안됩니다.
마찬가지 이유입니다. 기존값이 null 이므로 비교가 안됩니다.
IF NVL(:OLD.EMAIL, 'x') != NVL(:NEW.EMAIL, 'x') THEN 해야 합니다.