2009-11-09 2 views
3

입력 파일의 데이터와 함께 테이블에 삽입 할 수 있도록 SQL * Loader 제어 파일에서 입력 데이터 파일 이름에 액세스하려면 어떻게합니까?SQL * Loader 제어 파일 내에서 데이터 파일에 액세스

LOAD DATA 

APPEND 
INTO TABLE STG_AM02_BA_RAW 
WHEN (1:2) = 'DT' 
(
     SUBSCRIBER_NO     POSITION(11:18)CHAR, 
     ACCOUNT_NO      POSITION(19:32)CHAR, 
     SUBSCRIBER_NAME     POSITION(33:92)CHAR 
) 

내가 같은 것을하고 싶지 :

LOAD DATA 

APPEND 
INTO TABLE STG_AM02_BA_RAW 
WHEN (1:2) = 'DT' 
(
     SUBSCRIBER_NO     POSITION(11:18)CHAR, 
     ACCOUNT_NO      POSITION(19:32)CHAR, 
     SUBSCRIBER_NAME     POSITION(33:92)CHAR, 
     INPUTFILE      INPUTFILENAME()CHAR 
) 

을 내가 접근도 쉘을 편집 할 수있는 권한이 없습니다 있다고 가정

나는 다음과 같은 제어 파일이의 예를 들어 가정 해 봅시다 이 제어 파일로 SQL * Loader를 호출하는 스크립트.

답변

1

11g부터는 SQL * Loader 제어 파일에서 직접 파일 이름에 액세스 할 수 없습니다.

기본적으로 스크립트 환경에서 처리해야합니다.

로딩 스크립트를 수정할 수없는 경우 데이터 파일에 헤더 레코드를 추가 할 수 있습니까?

1 : 2 위치에 레코드 유형 필드가있는 것 같습니다. 파일 이름 레코드 유형을 포함하도록 데이터 파일 생성을 수정할 수 있습니까? 예를 들어

하는 "FN"데이터 형식 : 데이터 파일을 업데이트 할 수 있습니다

LOAD DATA 

APPEND 
INTO TABLE STG_AM02_BA_RAW 
WHEN (1:2) = 'FN' 
(
     INPUTFILE      POSITION(1:92)CHAR 
) 
WHEN (1:2) = 'DT' 
(
     SUBSCRIBER_NO     POSITION(11:18)CHAR, 
     ACCOUNT_NO      POSITION(19:32)CHAR, 
     SUBSCRIBER_NAME     POSITION(33:92)CHAR 
) 

모두 따라 ...

:에

FN    ...  inputfile.txt 
DT  12345678XXX...XXXXXYYYYYYYYYYYYYYYY 
DT  12345678XXX...XXXXXYYYYYYYYYYYYYYYY 
DT  12345678XXX...XXXXXYYYYYYYYYYYYYYYY 
DT  12345678XXX...XXXXXYYYYYYYYYYYYYYYY 
DT  12345678XXX...XXXXXYYYYYYYYYYYYYYYY 

부하 스크립트 후 변경 될 수 있습니다

예 :

echo "FNinputfile.txt" > header.txt 
cat header.txt inputfile.txt > newinputfile.txt 

각 데이터 행에 대해 파일 이름을 참조해야하는 경우 데이터를 여러 개의 스테이징 테이블에로드 할 수 있습니다.

...SQL을 사용하여 함께 참여하십시오.

insert into STG_AM02_BA_RAW 
    (
    subscriber_no, 
    account_no, 
    subscriber_name, 
    input_filename 
    ) 
select 
    d.subscriber_no, 
    d.account_no, 
    d.subscriber_name, 
    f.inputfile 
from 
    stage_data d, 
    inputfile d 

동시로드가있는 경우이 프로세스가 실패합니다.

당신은 데이터 파일을 변경할 수 있다고 말했습니까? 파일 이름이 각 레코드에 추가되도록 파일을 변경할 수 있습니까? 그렇다면 문제를 해결하십시오.

SUBSCRIBER_NAME     POSITION(92:*)CHAR 
+0

그래, 내가 입력 파일을 수정할 수 있다고 생각해. 감사! 난 그 생각하지 않았다 : P – Lukman

+0

오, 잠깐, 내가 당신의 대답을 틱하기 전에 어떻게 테이블에 모든 삽입 파일 이름을 포함합니까? sql * 로더가 라인을 하나씩 처리 중이므로 이전 라인으로 역 참조 할 수 있습니까? – Lukman

+0

데이터를 두 개의 스테이징 테이블에로드 한 다음 최종로드 테이블에 결합 할 수 있습니까? 내 답변에 예제가 포함됩니다. 예를 들어 –

1

"데이터"부분의 파일 이름을 제대로 참조 할 수있는 방법이 없다고 생각합니다. 해결 방법에 대한 아이디어의

커플 :

  • 업데이트 별도의 SQL 문을 사용하여 새로 삽입 된 기록. SQL * Loader를 호출하는 배치 파일에서 명령문을 빌드 할 수 있습니다.
  • 파일 이름을 포함하도록 데이터 파일을 수정하십시오 (배치 파일에서 다시 수행 할 수 있음).
  • 배치 파일이 상수로 파일 이름을 포함하는 제어 파일을 작성, 그래서 당신이 뭔가

    같습니다 INPUTFILE 상수 가질 수있다 "my_data.dat"

희망이 도움이됩니다.

+0

죄송하지만 이미 SQL * Loader를 호출 할 쉘 스크립트를 수정할 수 없다고 언급했습니다. 제어 파일을 수정하는 것이 허용되지만, 제어 파일은 명령 행에서 입력 파일 이름을 받아들이 기 때문에'INPUTFILE CONSTANT "를 사용하여 my_data.dat"가 작동하지 않습니다. – Lukman

0

이 문제를 해결하는 가장 쉬운 방법은 파일 이름과 각 레코드의 마지막에 여분의 열을 추가하고 필드에 해당 컬럼 위치를지도 : 당신은 포함해야 할 것이다.

+0

유닉스 환경에서 쉽게 할 수 있습니다. – Nash