Database/Oracle2009. 3. 20. 15:17

SQL*Loader는 외부 화일의 데이타를 ORACLE  데이타베이스의 테이블에 넣기 위한 유틸리티이다.
SQL*Loader를 사용하려면 외부 데이타 화일과 콘트롤화일이 필요하다.
콘트롤화일이라고 하는 것은 로드하는 데이타의 정보를 저장한 화일인데 예를 들면 다음과 같다.

  load data             ->  콘트롤화일의 앞에는 반드시 필요함
  infile sample.dat     ->  외부 데이타 화일을 지정
  replace               ->  테이블에 데이타 넣는 방법 지정
  into table TABLE_NAME ->  데이타를 로드하는 테이블을 지정
  fields terminated by ','    ->  데이타 필드의 종결문자 지정
  (a integer external,b char) ->  테이블의 열 및 외부데이타 화일의 데이타 형을 지정
                           
  *참고로 Replace 외에 다음의 옵션이 가능하다.

  replace   -> 테이블의 기존 행을 모두 삭제(delete)하고 Insert(7.0 에서는 truncate 함)
  append  -> 새로운 행을 기존의 데이타에 추가
  insert   -> 비어 있는 테이블에 넣을 때
  truncate -> 테이블의 기존 데이타를 모두 truncate 하고 인서트(7.0에는 없음)

  SQL*Loader를 실행하면 아래의 화일이 생성된다.
  - 로드 작업의 결과와 에러 등을 기록한 로그화일(확장자는 log)
  - 에러 때문에 로드가 안된 레코드를 저장한 화일(확장자는 bad)
  - 사용자의 선택 기준에 적합하지 않은 레코드를 저장한 파일(discard 화일)
    이것은 discardfile 옵션으로 별도로 지정해야 생성된다.


실행 방법

  $ sqlload scott/tiger control=sample.ctl data=sample.dat

  1. 임의의 컬럼에 문자열(값)을 입력한 경우

  [ 테이블 구조 ]
    create table cons_test (a number, b number, c number, d varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile cons.dat
    replace
    into table cons_test
    fields terminated by ','
    (a integer external,
      b integer external,
      c CONSTANT '100',
      d char)

  [ 외부 데이타 파일 cons.dat의 내용 ]
    1,2,DATA
    2,4,DATA2

  [ 검색결과 ]
    SQL> select * from cons_test;
        A       B       C    D
    ------- ----- ------ ------------
        1       2     100   DATA
        2       4     100   DATA2


  2. 로드한 때의 날짜를 넣고 싶은 경우

  [ 테이블 구조 ]
    create table sysdatetb (a number, b date, c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile sysdate2.dat
    replace
    into table sysdatetb
    fields terminated by ','
    (a integer external,
      b sysdate,
      c char(10))

  [ 외부 데이타 화일 ]
    111,STRINGS
    222,STRINGS2

  [ 검색결과 ]
    SQL> select * from sysdatetb;
        A         B           C
     -------  ---------  ----------
      111    13-MAY-94    STRING
      222    13-MAY-94    STRING2

  SYSDATE는 Conventional Path의 경우는  실행시에 삽입된 각각의 레코드 배열마다, Direct Path의 경우는 로드된 각각의 레코드의 블록마다 사용된다. 새로운 값으로 변경된다.


  3. SEQUENCE를 임의의 수에서 임의의 수만큼 붙이고 싶은 경우

  [ 테이블 구조 ]
    create table seqtb (a varchar(10), b number, c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile seq.dat
    replace
    into table seqtb
    fields terminated by ','
    (a char,
      b sequence(100,5),
      c char)

  [ 외부 데이타 화일 ]
    1,a
    2,b
    3,c

  [ 검색결과 ]
    SQL> select * from seqtb;
     A    B     C
   ----- ---- --------
    1    100    a
    2    105    b
    3    110    c


  4. 논리 레코드를 구성하는 물리 레코드가 여러줄로 구성된 경우(물리 레코드의 1바이트째로 판단되는 경우)

  [ 테이블 구조 ]
    create table conti_test (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile conti.dat
    replace
    continueif this (1) = '%'
    into table conti_test
    fields terminated by ','
    (a char,
      b char,
      c char)

  [ 외부 데이타 화일 ]
    %1,
    %2,
    3
    %A,B
    ,C
    %a,b
    %c
    %d
    ,ef

  [ 검색결과 ]
    SQL> select * from conti_test;
      A      B       C
    ---- ------ --------
      1      2       3
      A      B       C
      a      bcd     ef
  이 예의 경우 1바이트 째가 계속 행의 체크를 위해서 사용되기 때문에 실제의 데이타를 1바이트 째부터 시작해서는 안된다.
  위의 경우, 레코드의 선두 바이트가 '%'일 때 다음의 레코드가 연결된다.


  5. 외부데이타 화일의 물리 레코드가 복수 레코드로 구성된 경우(구성하는 물리 레코드 수가 모두 일정한 경우)

  [ 테이블 구조 ]
    create table con_test (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile conti.dat
    replace
    concatenate 2
    into table con_test
    fields terminated by ','
    (a char,
      b char,
      c char)

  [ 외부 데이타 화일 ]
    1,2,
    3
    a,b,
    c
    A,
    B,C

  [ 검색결과 ]
    SQL> select * from con_test;
      A       B       C
    ----- ------ -------
      1       2       3
      a       b       c
      A       B      C


  6. 포지션 지정시 char형 전후의 블랭크도 로드하고 싶은 경우

  [ 테이블 구조 ]
    create table pretb (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile pre.dat
    preserve blanks
    into table pretb
    (a position(01:05) char,
      b position(06:10) char,
      c position(11:20) char)

  [ 외부 데이타 화일 ]
    12 4  67890 ab def hi
       2  67890 ab def hi

  [ 검색결과 ]
    SQL> select * from pretb;
        A       B         C
     ------- ------- ------------
      12 4    67890   ab def hi
         2    67890   ab def hi

    SQL> select length(a), length(c) from pretb;
      LENGTH(A) LENGTH(C)
      --------- ----------
          5        10
          5        10


  7. 데이타가 없는 경우 NULL 데이타를 넣고자 할 때

  [ 테이블 구조 ]
    create table tratb (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile tra.dat
    into table tratb
    fields termintated by ','
    trailing nullcols
    (a char,
      b char,
      c char)

  [ 외부 데이타 화일 ]
    1,aa,
    2,bb,FF
    3,cc,

  [ 검색결과 ]
    SQL> select * from tratbl
      A       B       C
    ----- ----- -------
      1    aa
      2    bb      FF
      3    cc

  trailing nullcols를 사용하지 않으면 1 레코드째와 3 레코드째가 데이타 에러가 된다.


  8. CHAR형 필드가 BLANK로 채워져 있을 때 NULL을 삽입하고 싶은 경우

  [ 테이블 구조 ]
    create table nulltb (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile null.dat
    replace
    into table nulltb
    fields terminated by ','
    (a char,
      b char,
      c char(10) nullif c = blanks)

  [ 외부 데이타 화일 ]
    aa,bb, ,
    11,22, ,
    99,88,AA
    00,00,BB

  [ 검색결과 ]
    SQL> select * from nulltb;
      A       B       C
    ----- ------ ------
      aa      bb
      11      22
      99      88      AA
      00      00      BB


  9. POSITION 지정시 BLANK를 그대로 로드하고 싶은 경우

  [ 테이블 구조 ]
    create table nulltb2 (a varchar(10), b varchar(10), c date)

  [ 콘트롤 화일 ]
    load data
    infile null3.dat
    replace
    preserve blanks
    into table nulltb2
    (a position(1:2) char,
      b position(3:4) char nullif b = blanks,
      c position(5:13) date "YY/MM/DD")

  [ 외부 데이타 화일 ]
    998892/11/11
        94/12/12

  [ 검색결과 ]
    SQL>select * from nulltb2;
      A       B       C
    ----- ----- ---------------
    99      88      92/11/11
                    94/12/12

    SQL> select length(a), length(b) from nulltb2;
      LENGTH(A) LENGTH(B)
    --------- ----------
          2         2
          2


  10. BLANK가 들어가 있을 때 0을 입력하고 싶은 경우

  [ 테이블 구조 ]
    create table def2 (a varchar(10), b varchar(10), c number)

  [ 콘트롤 화일 ]
    load data
    infile def2.dat
    replace
    into table def2
    fields terminated by ','
    (a char,
      b char,
      c integer external defaultif c = blanks)

  [ 외부 데이타 화일 ]
    11,11,123
    22,22, ,
    33,33, ,
    44,44, ,

  [ 검색결과 ]
    SQL> select * from deft;
      A       B        C
    ----- -------- -------
      11      11       123
      22      22         0
      33      33         0
      44      44         0


  11. 데이타가 NULL일 때 NULL이라고 하는 문자열을 넣을 경우

  [ 테이블 구조 ]
    create table ifnulltb (a varchar(10), b varchar(10), c varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile ifnull.dat
    replace
    into table ifnulltb
    fields terminated by ','
    (a char,
      b char "nvl(:b,'NULL')",
      c char)

  [ 외부 데이타 화일 ]
    1,2,3,
    A,,B
    a,b,c

  [ 검색결과 ]
    SQL> select * from ifnulltb;
      A       B       C
    ----- ------ --------------
      1       2       3
      A       NULL    B
      a       b       c

  NVL과 같은 SQL 함수는 DIRECT LOAD의 경우 SQL 인터페이스를 경유하지 않기 때문에 사용할 수 없다.


  12. 어떤 열을 모두 대문자(소문자)로 변환하여 로드하는 경우

  [ 테이블 구조 ]
    create table uptb
    (a varchar(10),
      b varchar(10))

  [ 콘트롤 화일 ]
    load data
    infile upper.dat
    replace
    into table uptb
    fields terminated by ','
    (a char "lower(:a)",
      b char "upper(:b)")

  [ 외부 데이타 화일 ]
    aBcDeFg,AbCdEf
    ccDD11,ffGG22

  [ 검색결과 ]
    SQL>select * from uptb;
      A         B
    ------- -------------
    abcdefg   ABCDEF
    cdd11     FFGG22

Posted by Huikyun