2015-01-07 4 views
0

SQL * Loader 스크립트에 대한 제어 파일을 만들려고합니다. NOT NULL로 정의 된 날짜 열이 있습니다. 파일에서 들어오는 값이 비어 있으면 현재 날짜를 사용하도록 스크립트를 설정해야합니다. 몇 가지 방법을 시도했는데 아래 예제와 같이 SQL 로더를 실행할 때 오류 아래에 계속 표시되지만 형식을 선택하면 이중에서 선택합니다.SQL * Loader - 들어오는 값이 비어있는 경우 sysdate 사용

SQLLoader에서 어떻게 설정해야합니까?

PROGRAM_CHANGE_TS  POSITION(37:47) DATE "decode(length(trim(:PROGRAM_CHANGE_TS)), 11, to_date(:PROGRAM_CHANGE_TS,'yymmddHH24:MI'),to_date(sysdate,'yymmddHH24:MI'))", 
    PROGRAM_CHANGE_TS  POSITION(37:47) DATE "NVL(Decode(:PROGRAM_CHANGE_TS,'00/00/0000',TO_DATE('01/01/2010','dd/mm/yyyy'),TO_DATE(:PROGRAM_CHANGE_TS,'dd/mm/yyyy')),TO_DATE('01/01/2010','dd/mm/yyyy'))", 

오라클 디코드 예 ORA-00907 : 누락 된 오른쪽 괄호

select decode(length(trim(:PROGRAM_CHANGE_TS)), 11, to_date(:PROGRAM_CHANGE_TS,'yymmddHH24:MI'),to_date(sysdate,'yymmddHH24:MI')) from dual 

또는

select NVL(Decode(:PROGRAM_CHANGE_TS,'00/00/0000',TO_DATE('01/01/2010','dd/mm/yyyy'),TO_DATE(:PROGRAM_CHANGE_TS,'dd/mm/yyyy')),TO_DATE('01/01/2010','dd/mm/yyyy')) from dual 

내가 SQL에서 사용할 수 있도록해야합니까 어떤 변화

를 작동 로더 제어 파일?

답변

0

ctl 파일에 to_date을 사용하고 있으므로 명시적인 DATE 지정자를 제거하십시오.

또한 decodelength, nvl과 함께 trim을 사용할 필요가 없습니다.

마지막으로 sysdate은 이미 날짜이므로 to_date으로 명시 적으로 날짜를 변환 할 필요가 없습니다.

다음은 (테스트하지) 작동합니다 :

PROGRAM_CHANGE_TS POSITION(37:47) "nvl(to_date(trim(:PROGRAM_CHANGE_TS),'yymmddHH24:MI'),sysdate)", 
+0

죄송합니다. 실수로 위의 의견을 추가했습니다. 나는이 NVL을 테스트했다. 감사. NVL 부분을 사용했는데 이제는 ORA-00907 오류가 발생하는 문제가 있습니다. 그 오류는 이제 제거되었습니다. 들어오는 데이터가 공백 일 때 아래의 오류가 계속 발생합니다 (열 PROGRAM_CHANGE_TS). ORA-01858 : 수치가 아닌 문자가 발견되었습니다. 어떻게 그 부분을 해결할 수 있습니까? 또한 한 가지 다른 질문 - 비어 있지 않은 데이터는 2 자리 연도이므로 모두 20YY로 삽입됩니다.이 값을 어떻게 변경하여 70보다 높은 값을 19YY로 변환 할 수 있습니까? – adbdkb

+0

'create table' 문을'* .ctl' 파일에 게시하고 샘플 데이터의 몇 개 레코드를 게시하면 더 잘 도와 줄 수 있습니다. –

0

내가 설정 스크립트를 현재 날짜를 사용하려면 파일에서 입력 값이 비어있는 경우 필요합니다.

당신이 날짜 컬럼에 대한 NULL 값을 얻을 경우

는 단순히 대신 SYSDATE를로드 NVL 기능을 사용하십시오.

PROGRAM_CHANGE_TS POSITION(37:47) DATE "NVL(:PROGRAM_CHANGE_TS, SYSDATE)"

BLANKNULL 사이에 혼동하지 마십시오. 00/00/0000이 (가) 공백이거나 null이 아닙니다. 값으로 00/00/0000을 얻는다면 DECODE을 사용하십시오.

PROGRAM_CHANGE_TS POSITION(37:47) DATE "DECODE(:PROGRAM_CHANGE_TS, '00/00/0000', SYSDATE, :PROGRAM_CHANGE_TS)"

+0

감사합니다. NVL 부분을 사용했는데 이제는 ORA-00907 오류가 발생하는 문제가 있습니다. 그 오류는 이제 제거되었습니다. 들어오는 데이터가 공백 인 경우에도 여전히 아래 오류가 발생합니다. '열 PROGRAM_CHANGE_TS.ORA-01858 : 수치가 아닌 문자가 발견되었습니다. 어떻게 그 부분을 해결할 수 있습니까? – adbdkb

+0

또 다른 질문 - 비어 있지 않은 데이터는 2 자리 연도이므로 모두 20YY로 삽입됩니다. 어떻게하면 70보다 높은 값을 19YY로 변환 할 수 있습니까? – adbdkb

+0

'YY' 대신에'RR' 형식을 사용하십시오. 'toddate ('01/01/72 ','dd/mm/rr ') 이중에서 –