SQL*Loader시 NVL, DEOCDE 함수 차이점이 이해가 안되는 부분이 있습니다. 0 2 5,222

by 싸나이의로망 [DB 기타] Loader SQL Nvl DECODE [2016.03.23 14:58:17]


 

안녕하세요, 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 이런식으로 시분초까지 저장이 되더라구요.

혹시 함수에서 처리하는데 차이점이 있는지요?

아무리 생각해도 두 함수의 차이점이 이해가 안되네요

 

혹시 이유를 아시는분은 소중한 조언 부탁드리겠습니다.

by 마농 [2016.03.23 15:18:31]

NVL(:a, sysdate) 에서
:a 가 널이 아니면 그대로 :a 를 널이면 sysdate 으로 치환하는거죠.
이 때 두개 인자 :a 와 sysdate 은 형식이 일치해야 합니다.
여기서는 :a 를 문자로 인지한거죠.
뒤에 오는 sysdate 이 문자가 아니므로 문자로 자동 치환합니다.
이 때 별도 포멧을 지정하지 않았으므로 시스템 기본 날짜 포멧을 따릅니다.


DECODE(:b, null, sysdate) 에서는
:b 가 널이면 sysdate 을 반환하는 거죠
구문도 틀렸네요. 널이 아닐 때 반환할 값이 지정 안되어 있네요.
DECODE(:b, null, sysdate, :b) 로 해야 겠죠.
NVL 과 달리 앞쪽에 오는 sysdate 형식을 뒤에 오는 :b 가 따라가야 하는 거죠.


이런 묵시적 형변환에 의존해서는 안되구요.
명시적인 형변환을 통해 원하는 형태로 변환을 해주세요


by 싸나이의로망 [2016.03.31 20:24:18]

답변 감사합니다~!

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