2016-07-05 3 views
0

첫번째 질문을 여러 CSV를로드하는 방법 : 나는 test1.csv, test2.csvtest3.csv, 표 2표 3에로드하려고 각각 SQLLDR을 사용합니다. 이 영역에 대한 지식이 있다면 .ctl 파일에서이를 정의하는 동안 제대로 이해하지 못했을뿐입니다. 아래 코드는 생각할 수 있지만 올바르지 않습니다. 그래서 내 질문은 내가 어떻게이 권리를 만들 수 있을까 아니면 이것이 가능한가?SQLLDR - multple 테이블에

OPTIONS (SKIP=1) 
LOAD DATA 

INFILE 'test1.csv' 
INFILE 'test2.csv' 
INFILE 'test2.csv' 

TRUNCATE 

INTO TABLE table1 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 


INTO TABLE table2 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

두 번째 질문 :이 첫 번째 질문의 대안입니다. 처음부터 알아낼 수 없기 때문에, 내가 한 것은 각 테이블의로드를 여러 .ctl 파일로 분할하고 .bat 파일에서이 세 가지를 모두 호출하는 것입니다. 이것은 적어도 작동하지만 내 질문에 사용자/암호를 세 번 언급하지 않고 세션에서 이러한 모든 3 .ctl 파일을 처리 할 수있는 방법은 무엇입니까? 파일의 데이터를 대상으로하는 것이 어떤 테이블 표시 할 수있는 사용할 수있는 필드가있는 경우

sqlldr userid=user/[email protected] control=test1.ctl 
sqlldr userid=user/[email protected] control=test2.ctl 
sqlldr userid=user/[email protected] control=test3.ctl 
+0

데이터가 들어갈 표를 키로 사용할 수있는 표시기 필드가 이미 있거나 추가되어 있습니까? –

+0

데이터를 구분하기 위해 키를 사용하지 않았지만 키를 추가하여 시도해 볼 수 있습니다. – Chito

답변

0

, 당신은 여러에게 INFILE satements를 사용하여이 같은 작업을 수행 할 수 있습니다. (SQLLDR 그것을 무시 있도록 필러로 정의)의 첫 번째 필드가 표시이며이로드되지 않습니다 가정 해 봅시다 : 그래서 논리적으로

... 
INTO TABLE table1 
WHEN (01) = 'TBL1' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 

INTO TABLE table2 
WHEN (01) = 'TBL2' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
WHEN (01) = 'TBL3' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

, 각 테이블에 절은 각 파일을 처리 할 때. 유연하지는 않지만 틀림없이 유지하기가 더 어렵습니다. 유지 보수를 쉽게하기 위해 각 파일에 대한 제어 파일을 원할 수 있습니다. 모든 파일과 테이블이 동일한 레이아웃이면로드가 용이 한 동일한 스테이징 테이블 (인디케이터 포함)에 모든 파일을로드 한 다음 나중에 프로그래밍 방식으로 별도의 테이블로 분할 할 수도 있습니다. 이 방법의 장점은 프로세스의 개별 테이블 부분으로 분할하는 것보다 빠르고 쉽게로드하고 제어 할 수 있다는 것입니다. 그냥 다른 아이디어. 각 방법을 완료했습니다. 요구 사항에 따라 달라질 수 있습니다.

+0

나는 당신이 말하는 것을 가지고있어, 아마 그들 모두를 분리시켜 두는 것이 가장 좋다. – Chito

+0

두 번째 질문으로 돌아 가면 위에 제공된 예제 이외의 여러 .ctl 파일을 추가하는 방법이 있습니까? – Chito

+0

'sqlldr' 명령 줄 인수 중 하나는 사용자 ID 정보를 포함 할 수있는 매개 변수 파일입니다. 그래도 보안 문제가 발생합니다. 자세한 내용은 여기를 참조하십시오. http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_params.htm#i1005781. 그렇지 않으면'sqlldr'을 호출 할 때마다 프로그래밍 방식으로 다른 매개 변수를 전달해야 할 것이라고 생각합니다. 이것이 우리가하는 일입니다. 우리는 각 파일에 대한로드 설정을 가지고있는 테이블을 가지고 있으며 스케줄러는 그 파일을 읽어 들여서 커맨드 라인을 만들고 실행합니다. –

관련 문제