안녕하세요..트리거로 수정된 데이터가 있을시 로그를 쌓으려고 하는데요...
데이터 타입이 Date나 BLOB 인 경우 Null체크 및 비교를 어떻게 해야 하는지요??
String 타입이나 Number 는
IF NVL(:OLD.EMAIL, 'x') != NVL(:NEW.EMAIL, 'x') OR NVL(:OLD.NUM, 0) != NVL(:NEW.NUM, 0) THEN 이렇게 비교하면 되는데..
Date나 BLOB 인 경우 변경여부를 어떻게 체크해야 하는지요?
아..date 타입은 문자로 변환 후 비교하면 되겠군요..
NVL(TO_CHAR(:OLD.CHGDT, 'YYYYMMDDHH24MISS'), 'X') != NVL(TO_CHAR(:NEW.CHGDT, 'YYYYMMDDHH24MISS'), 'X')
수정..
질문을 올리고 인터넷을 검색해 보니 DBMS_LOB.COMPARE 로 비교가 가능하네요...
정리 하자면 ..
NVL(:OLD.EMAIL, 'x') != NVL(:NEW.EMAIL, 'x') --문자타입 비교
NVL(:OLD.NUM, 0) != NVL(:NEW.NUM, 0) -- 숫자타입 비교
NVL(TO_CHAR(:OLD.CHGDT, 'YYYYMMDDHH24MISS'), 'X') != NVL(TO_CHAR(:NEW.CHGDT, 'YYYYMMDDHH24MISS'), 'X') -- Date타입 비교
DBMS_LOB.COMPARE(:OLD.IMG, :NEW.IMG) != 0 -- LOB타입 비교
이런식으로 비교 하는게 맞는 건가요??
마농님 답변 감사드립니다...함수를 또하나 새로 배우네요..^^
아..생각해 보니 값을 입력안했으면 트리거에서 Null에서 Null 체크도 해야 하네요....ㅠㅠ
WITH TMP AS ( SELECT 'Null에서 문자로' TXT, NULL ASIS, '123' TOBE FROM DUAL UNION ALL SELECT '문자에서 Null로' TXT, 'AAA' ASIS, NULL TOBE FROM DUAL UNION ALL SELECT 'Null에서 Null로' TXT, NULL ASIS, NULL TOBE FROM DUAL UNION ALL SELECT '동일 문자로' TXT, '123' ASIS, '123' TOBE FROM DUAL UNION ALL SELECT '다른 문자로' TXT, '123' ASIS, '456' TOBE FROM DUAL ) --SELECT * FROM TMP --WHERE LNNVL(ASIS = TOBE); SELECT TMP.*, LNNVL(ASIS = TOBE) FROM TMP ; 이렇게 해봤는데 이게 최선인지 확신이 안서네요..ㅠㅠ
IF NVL(:OLD.EMAIL, 'x') != NVL(:NEW.EMAIL, 'x') --문자타입 비교 OR NVL(:OLD.NUM, 0) != NVL(:NEW.NUM, 0) -- 숫자타입 비교 OR NVL(TO_CHAR(:OLD.CHGDT, 'YYYYMMDDHH24MISS'), 'X') != NVL(TO_CHAR(:NEW.CHGDT, 'YYYYMMDDHH24MISS'), 'X') -- Date타입 비교 OR ((:OLD.IMG IS NOT NULL AND :NEW.IMG IS NOT NULL AND DBMS_LOB.COMPARE(:OLD.IMG, :NEW.IMG) != 0) -- LOB타입 비교 OR (:OLD.IMG IS NOT NULL AND :NEW.IMG IS NULL) OR (:OLD.IMG IS NULL AND :NEW.IMG IS NOT NULL)) THEN ... END IF;