안녕하세요, SQL*Loader 통해서 단순 DAT 파일을 불러오고 있는 상황입니다.
Ctl 파일은
LOAD DATA
APPEND
INYO TABLE XXXXXXXXX
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
A "nvl(:A, SYSDATE)"
, B "DECODE(:B, null, SYSDATE)"
)
이런식으로 구성을 했는데요, 테이블의 A, B컬럼은 모두 DATE 타입의 컬럼입니다.
여기서 문제는 NVL 함수와 DECODE 함수입니다.
A, B 값의 모두 NULL 로 들어왔을때 A의 컬럼에는 2016-03-23 으로 TRUNC 되어서 값이 저장되는 반면
B의 컬럼에는 2016-03-23 14:56:21 이런식으로 시분초까지 저장이 되더라구요.
혹시 함수에서 처리하는데 차이점이 있는지요?
아무리 생각해도 두 함수의 차이점이 이해가 안되네요
혹시 이유를 아시는분은 소중한 조언 부탁드리겠습니다.
NVL(:a, sysdate) 에서
:a 가 널이 아니면 그대로 :a 를 널이면 sysdate 으로 치환하는거죠.
이 때 두개 인자 :a 와 sysdate 은 형식이 일치해야 합니다.
여기서는 :a 를 문자로 인지한거죠.
뒤에 오는 sysdate 이 문자가 아니므로 문자로 자동 치환합니다.
이 때 별도 포멧을 지정하지 않았으므로 시스템 기본 날짜 포멧을 따릅니다.
DECODE(:b, null, sysdate) 에서는
:b 가 널이면 sysdate 을 반환하는 거죠
구문도 틀렸네요. 널이 아닐 때 반환할 값이 지정 안되어 있네요.
DECODE(:b, null, sysdate, :b) 로 해야 겠죠.
NVL 과 달리 앞쪽에 오는 sysdate 형식을 뒤에 오는 :b 가 따라가야 하는 거죠.
이런 묵시적 형변환에 의존해서는 안되구요.
명시적인 형변환을 통해 원하는 형태로 변환을 해주세요