먹고사는것/OracleDB

SQL Loader 사용법

아트리(喆) 2009. 10. 22. 14:16

출처: http://essbi.tistory.com/4?srchid=BR1http%3A%2F%2Fessbi.tistory.com%2F4

 

1. SQL*Loader란 ?
 SQL*Loader란 외부 화일 데이터를 ORACLE 데이타베이스의 테이블에 넣기 위한 유틸리티 입니다.

2. SQL*Loader 특징
 ① 하나 이상의 입력 파일을 사용 할 수 있습니다.    
 ② 로드를 위해 여러 개의 입력 레코드가 하나의 논리적 레코드로 결합될 수 있습니다.  
 ③ 입력 필드는 고정된 길이를 가질 수도, 다양한 길이를 가질 수도 있습니다.  
 ④ 입력 데이터는 문자, 이진, 팩 십진수(packed decimal), 날짜, 그리고 존 십진수(zoned decimal)등의
     어떤 유형도 사용 할 수 있습니다.      
 ⑤ 데이터는 디스크나 테이프, 또는 명명된 파이프 등 여러 유형의 매체로부터 로드될 수 있습니다.  
 ⑥ 데이터는 한 번에 여러 테이블로 로드될 수 있습니다.      
 ⑦ 데이터는 데이터베이스 버퍼 캐쉬를 거치지 않고 테이블로 직접 로드될 수 있습니다.

3. SQL*Loader의 사용
 ① 문법
     SQLLDR [keyword=] value  [ [keyword=] value ]...

    - KEYWORD : 아래에 설명되는 키워드중의 하나
    - VALUE : 키워드에 지정되는 값

 ② 예제)
    SQLLDR userid=scott/tiger control='ulcase1.ctl' log='ulcase1.log' direct=true

 ③ 키워드
 

키워드

설    명

 USERID

 오라클 사용자 이름과 암호를 지정 합니다.

 CONTROL

 콘트롤 파일 이름, SQL*Loader을 수행하기 위해서는 항상 지정해 주어야
 합니다.

 LOG

 로그 파일 이름을 지정 합니다. (기본 이름은 controlfile.log)

 BAD

 거부된 레코드 모두를 저장하는 배드 파일 이름을 지정 합니다.
 (기본 이름은 controlfile.bad)

 DATA

 입력 데이터 파일 이름을 지정 합니다.

 DISCARD

 Load시 선택되지 않은 레코드가 저장되는 디스카드 파일(선택 사항)

 DISCARDMAX

 버림(discard)의 최대 허용 갯수를 지정 합니다.

 ERRORS

 허용하는 배드 레코드의 최대 수를 지정 합니다.

 DIRECT

 TRUE로 설정되면 SQL*Loader는 DIRECT PATH를 사용.
 반대의 경우는 기본 값인 CONVENTIONAL PATH를 사용 합니다.

 PARFILE

 추가 파라미터 파일을 지정 합니다.

 PARALLEL

 DIRECT 로드에서만 적합한 이 파라미터는 다중 병렬 DIRECT로드가
 수행되도록 지정 합니다.

 FILE

 병렬 DIRECT로드의 경우 임시 세그먼트가 생성될 파일을 지정 합니다.


훗..자료를 긁으니 HTML 태그까지 다 나오는군요...음..기특한 태터...^^;

암튼 내용으로 보아..내가 하고자 하는 업무에 정말 적합한 내장 유틸인듯하다..
어떠것도 업로드가 가능하다고 한다... 그럼 예제를 봐야지...

아래는 오라클클럽 에서 가져온 예시이다.. 제어파일이 있을때와 없을때를 구분해 놨다..

연습용 테이블 생성


SQL>CREATE TABLE DEPT_TEST(
          DEPTNO NUMBER NOT NULL,
          DNAME  VARCHAR2(14),
          LOC  VARCHAR2(13))    
 
테이블이 생성되었습니다.


SQL>CREATE TABLE EMP_TEST(  
         EMPNO NUMBER NOT NULL,
         ENAME VARCHAR2(10),
         JOB VARCHAR2(9),
          MGR NUMBER(4),
         HIREDATE DATE,
         SAL  NUMBER(7,2),
         COMM NUMBER(7,2),
         D0EPTNO  NUMBER(2))

테이블이 생성되었습니다.



제어파일에 데이터가 들어가 있는 경우

- DEPT_TEST 테이블에 insert하는 예제 입니다.
- 각 데이터의 레코드의 필드를 ','로 구분을 했습니다  

============== dept_test.ctl 시작 ==============
LOAD DATA
INFILE *
INTO TABLE DEPT_TEST
FIELDS TERMINATED BY ','
(DEPTNO, DNAME, LOC)
BEGINDATA    -- 데이터 시작을 알림
12,RESEARCH,SARATOGA
10,ACCOUNTING,CLEVELAND
11,ART,SALEM
13,FINANCE,BOSTON
21,SALES,PHILA
22,SALES,ROCHESTER
42,"INT'L","SAN FRAN"

============== dept_test.ctl 끝 ==============



 - 위 부분을 dept_test.ctl파일로 저장을 합니다.
 - SQL*Loader을 실행 시킵니다.
 


C:\>sqlldr userid=scott/tiger control='C:\dept_test.ctl'

SQL*Loader: Release 8.1.6.0.0 - Production on 일 Dec 16 11:59:16 2001

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

커밋 시점에 도달 - 논리 레코드 개수 6
커밋 시점에 도달 - 논리 레코드 개수 7

  - 데이터가 INSERT 되었는지 확인 합니다.
  - dept_test.log파일이 생겼는지 확인해 봅니다.    
 
C:\>SQLPLUS scott/tiger

SQL>SELECT * FROM dept_test;

DEPTNO DNAME          LOC
------- -------------- -----------
    12 RESEARCH         SARATOGA
    10 ACCOUNTING      CLEVELAND
    11 ART                   SALEM
    13 FINANCE             BOSTON
    21 SALES               PHILA
    22 SALES               ROCHESTER
    42 "INT'L"               "SAN FRAN"
   



제어파일과 데이터 파일이 분리된 경우

- Control File 부분은 dept.ctl로 저장 합니다.
- Data File 부분은 dept.dat로 저장을 합니다.

------------ dept.ctl 시작 ------------
LOAD DATA
INFILE 'dept.dat'    -- Data File을 지정 합니다.
APPEND                 -- 기존에 데이터에 새로운 데이터를 추가 합니다.
INTO TABLE DEPT_TEST
FIELDS TERMINATED BY ','
(DEPTNO, DNAME, LOC)

------------ dept.ctl 끝 ------------



------------ dept.dat 시작 ------------

50,ACCOUNTING,NEW_YORK
60,RESEARCH,DALLAS
70,OPERATIONS,BOSTON

------------ dept.dat 시작 ------------


 - SQL*Loader을 실행 시킵니다.

C:\>sqlldr userid=scott/tiger control='C:\dept.ctl'

SQL*Loader: Release 8.1.6.0.0 - Production on 일 Dec 16 12:08:26 2001

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

커밋 시점에 도달 - 논리 레코드 개수 2
커밋 시점에 도달 - 논리 레코드 개수 3

 
 - 데이터가 INSERT 되었는지 확인 합니다.
 - 기존에 데이터에 새로운 데이터가 추가 된 것을 확인 할 수 있습니다.
 
SQL> SELECT * FROM dept_test;

   DEPTNO DNAME          LOC
---------- -------------- ------------
       12 RESEARCH        SARATOGA
       10 ACCOUNTING     CLEVELAND
       11 ART                  SALEM
       13 FINANCE            BOSTON
       21 SALES              PHILA
       22 SALES              ROCHESTER
       42 "INT'L"              "SAN FRAN"
       50 ACCOUNTING     NEW_YORK
       60 RESEARCH        DALLAS
       70 OPERATIONS     BOSTON

10 개의 행이 선택되었습니다.


SQL*Loader의 다른 사용법은 아래 링크를 참조해 보세용.

http://www.oracle.co.kr/support/web_sup ··· _02.html


내가 원하는 거의 모든 문법이 이 사이트에 있다...운영자 분은 김정식 님이신데...
정말 존경스러운 분이다...

위의 예제로도 모자라 마지막에 내가 원하는 해답을 적어 놓으셨다...^^

★ CLOB컬럼에 많은양이 데이터를 로드할 경우.
(DESCRIPTION컬럼이 CLOB일 경우)

LOAD DATA
INFILE 'C:\data.txt'
APPEND
INTO TABLE wp_test
FIELDS TERMINATED BY '|'
(test_id,test_name,description CHAR(8192000) nullif descript
ion=BLANKS)