레이블이 sqlldr인 게시물을 표시합니다. 모든 게시물 표시
레이블이 sqlldr인 게시물을 표시합니다. 모든 게시물 표시

2012-10-06

DBMS/오라클]SQL_Loader_사용법



출처 : http://blog.naver.com/hirokorea/20020980191
         http://nhmjh.egloos.com/1438719
문법
      SQLLDR [keyword=] value  [ [keyword=] value ]...

예제
      SQLLDR scott/tiger control='c:\xxx.ctl' log='xxx.log' direct=true

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

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

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

  BAD
  거 부된 레코드 모두를 저장하는 배드 파일 이름을 지정 합니다.

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

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

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

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

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

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

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

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

① SAMPLE TABLE 생성
-------------------------------------------------------------------------

CREATE TABLE TMP(
    SEQ_NUM     VARCHAR2(10) ,
    UNIQ_KEY    CHAR(7) ,
    RECORD_NUM  NUMBER(7,0),
    ISS_TIME    DATE,
    IF_STTS     CHAR(2),
    MEMO        VARCHAR2(100)
)
/

② SAMPLE 시퀀스 생성
-------------------------------------------------------------------------

CREATE SEQUENCE TMP_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 10000000000000000
NOMINVALUE
CYCLE
CACHE 20
NOORDER
/

③ SAMPLE 데이터 파일 생성
-------------------------------------------------------------------------

C:\S_DATAFILE.DAT
      120060123125959MEMO1
     2220060124125959MEMO2
    33320060125125959MEMO3

④ SAMPLE SQLLOADER CONTROLFILE 생성
-------------------------------------------------------------------------
C:\S_DATAFILE.CTL
Options (Rows = 1000)
Load DATA
INFILE     'C:\S_DATAFILE.DAT'
BADFILE  'C:\S_DATAFILE.BAD'

APPEND
    INTO TABLE TMP (
        --  SEQ_NUM컬럼의 최대값  +1을 대입
        SEQ_NUM            SEQUENCE(MAX,1) ,
        --  시퀀스 TMP_SEQ의 다음할당값 대입
        UNIQ_KEY            TMP_SEQ.NEXSVAL ,
        RECORD_NUM      POSITION( 1 : 7   ) DECIMAL EXTERNAL ,
        ISS_TIME             POSITION( 8 : 21 ) DATE "YYYY/MM/DD HH:MI:SS" ,
        IF_STTS               CONSTANT "00" ,
        MEMO                 POSITION( 22 : 116   ) CHAR
    )

⑤ SQLLOADER 실행
-------------------------------------------------------------------------
C:>sqlldr
 scott/tiger@XXXcontrol = C:\S_DATAFILE.CTL
//-----------------------------------------------------------------------------
출처 : http://cafe.naver.com/superadmin.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=42
sqlloader를 사용하기 위해서는 미리 테이블이 만들어져 있어야 함.

sqlloader 화일 샘플

#!/bin/csh
if ( $#argv != 2) then
    echo "Usage: $0 <DataFile> <logFileName>"
    exit 1
endif

sqlldr userid=oracle/oracle control=tblmacs_tmpidrlog.ctl data=$1 log=$2.log commit_discontinued=true

data는 raw데이타 들어갈 부분, log는 생략해도 무방..., commit으로 시작하는 부분도 생략가능

실행방법

sqlloader.sh "실제데이타 화일"
ex) sqlloader.sh  SWBLS1_FWEBIDR1_ID0001_T20030603000109.DAT

이런식으로 사용 가능(원격폴더 지정시)
## sqlloader.sh /bear02/macslog/20030401/SWBLS1_FWEBIDR1_ID0001_T20030401000110.DAT /bear01/brewlog/src/eshock/log/z0000

control화일 샘플

load data
INFILE *
append
into table TBLMACS_TMPIDRLOG
when RECORD_TYPE='R'
(
        RECORD_TYPE position(01:01) char
       ,RECORD_SEQ  position(02:08) char
       ,SVC_TYPE    position(09:09) char
       ,CALL_NUM    position(10:20) char
       ,CHARGE_NUM  position(21:31) char
       ,CP_NO       position(32:36) char
       ,CONTENTS_NO position(37:38) char
       ,MENU_NO     position(39:40) char
       ,CALL_START  position(41:54) char
       ,DURATION    position(55:63) char
       ,PKT_CNT     position(64:72) char
       ,PHONE_TYPE  position(73:87) char
       ,BROWSER_VER position(88:102) char
)

position은 순서대로 1부터 1까지 자름, 그다음 2칸째부터 8칸 이후까지를 의미함.





[ SQL*Loader 사용하기 ]
작성일자 : 2001년 6월 11일
작 성 자 : 조수환


1. SQL*Loader를 이용해서 Data를 넣을 파일을 Excel에서 생성한다.
        - 파일을 *.csv로 저장을 한다.
          (SQL*Loader 를 사용하기 위해서는 ,(콤마)가 필요하다)
        즉, 다음과 같은 데이타 포멧이면 된다.
                10000,CEO, 등록
                10020,CEO CEO실,등록
                150000,솔루션사업부 문,등록
                150010,솔루션사업부문 신프라팀,등록
                150020, 솔루션사업부문 기관영업팀,등록
                150030,솔루션사업부문 사업지원팀,등록
                150040, 솔루션사업부문 CS팀,등록

2. csv 파일에는 departcode, departname, gubun 의 형식을 데이타가 들어가 있다.

        Ex>        departcode,         departname,         gubun
                ---------- ------------------------------
                   180040         경영전략부문         홍보팀
                   190000         재경부문
                   190010         재경부문         재경기획팀
                   190020         재경부문         재경팀
                   190030         재경부문         물류지원팀
                   200000         인재기획실


3. Data를 넣을 테이블의 명세서는 다음과 같다.
        SQL> desc departinfo;
         이름       널?      유형
         ---------- -------- ------------
         ID         NOT NULL NUMBER
         DEPARTCODE              NUMBER(6)
         DEPARTNAME          VARCHAR2(40)
         CREATEDATE          DATE
         MODIFYDATE          DATE
         GUBUN               CHAR(4)
      

4. 콘트롤 파일(abc.ctl) 을 하나 만들고, 다음과 같은 내용을 기록한다.

        LOAD DATA
        INFILE '부서코드.csv'                        -- 참조할 파일은 부서코드.csv
        replace                                        -- 테이블의 내용을 모두 삭제한 후에 입력
        INTO TABLE departinfo                        -- 데이타가 들어갈 테이블 명
        fields terminated by ','                -- ,(콤마)를 기준으로 구분한다.
        (
          id                sequence(1,1),                -- 1부터 1씩 증가시킨다.
          departcode        integer external,        -- 외부의 데이타를 가져온다.
          departname        char(40),                -- 문자열은 40
          createdate        sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
          modifydate    sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
          gubun        char(4)                                -- 문자열은 4
        )


5. SQL*Loader를 실행시킨다.
        # sqldlr atomx/akstp@sysora control=abc.ctl log=0611.log
        - > 위와 같이 하면 부서코드.csv의 내용이 conrolfile의 정의와 함께
            테이블에 쭉 들어간다.



< 참조> 다른 컨트롤 파일의 내용

1. 컨트롤 파일(bbb.ctl)의 내용
        LOAD DATA
        INFILE '사원인사.csv'
        replace
        INTO TABLE companyinfo
        fields terminated by ','
        (
          id                sequence(1,1),
          companycode        integer external,
          name                char(20),
          departcode        integer external,
          tel                char(4) nullif tel = blanks,        -- 만일 공백이면 NULL상태로 만든다.
          enteringdate        date ,
          createdate        sysdate,
          modifydate    sysdate,
          gubun        char(4)
        )


2. sqlldr atomx/akstp@sysora control=bbb.ctl log=0611.log

//-----------------------------------------------------------------------------------
출처 : http://www.dbguide.net/dbqa/dbqa120001.jsp?mode=view&key=subject&search=Loader&divcateno=256&divcateno_=243&pg=1&idx=1
SQL*Loader 는 외부 화일의 데이타를 ORACLE 데이타베이스의 table에 넣기 위한 유틸리티입니다. SQL*Loader를 사용하려면 외부 데이타 화일과  컨트롤 화일이 필요합니다. 컨트롤 화일이라고 하는 것은 로드하는 데이타의  정보를 저장한 화일입니다.
간단한 샘플 컨트롤 화일을 설명하겠습니다.

    load data                        제어 화일의 선두에는 반드시 이 말이 필요합니다.
    infile sample.dat              외부 화일을 지정합니다.
    replace                           테이블에 데이타 넣는 방법 지정
    into table TABLE_NAME   데이타를 로드하는 테이블을 지정
    fields terminated by ','     데이타 필드의 종결 문자 지정
    (a integer external,          테이블의 열, 외부 데이타 화일의 데이타 형을 지정
     b char)

    참고로 replace 외에 다음의 옵션이 가능합니다.

    replace                 테이블의 기존 행을 모두 삭제(delete)하고 insert
    append                 새로운 행을 기존의 데이타에 추가
    insert                   비어 있는 테이블에 넣을 때
    truncate                테이블의 기존 데이타를 모두 truncate 하고 insert

    SQL*Loader를 실행하면 아래의 화일이 작성됩니다.

    * 로드 작업 중 동작에 관한 통계 등을 포함한 로그 화일(확장자는 log)
    * 데이타 에러 때문에 로드가 안된 레코드를 저장한 화일(확장자는 bad)
    * 사용자의 선택 기준에 적합하지 않은 레코드를 저장한 화일(discard 화일)
      이것은 discardfile 옵션으로 별도로 지정해야 생성됩니다.

실 행 방법은 다음과 같습니다.

$sqlldr scott/tiger control=sample.ctl data=sample.dat
1.1 임의의 열에 변화없는 고정 문자열(값)을 입력한 경우테이블 구조
    create table cons_test
    (a number,
     b number,
     c number,
     d varchar(10))

컨 트롤 화일 (즉 이예에서 sample.ctl)

    load data
    infile cons.dat
    replace
    into table cons_test
    fields terminated by ','
    (a integer external,
     b integer external,
     c CONSTANT '100',
     d char)

외부 데이타 화일 (즉, 이예에서 sample.dat)
    1,2,DATA
    2,4,DATA2

검색결과
    SQL>select * from cons_test;

           A       B       C D
    ---------------------------------
           1       2     100 DATA
           2       4     100 DATA2

주 의사항 : 이 예에서 C열은 데이타 화일에 넣어서는 안 됩니다. COSNTANT는 그것으로 완결된 열 지정의 하나가 됩니다. integer external 데이타 형은 수치 데이타를 문자형식(ASCII CODE)로 나타낸 것입니다.
1.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

주의사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안됩니다. SYSDATE는 그것으로 완결된 열 지정의 하나가 됩니다. 새로운 시스템 날짜매김은 컨벤셔널 패스에서는 실행 시에 삽입된 각각의 레코드 배열마다 또, 다이렉트 패스의 경우는 로드된 각각의 레코드의 블럭마다 사용됩니다.
1.3 임의의 수치열에 연속 번호(sequence)를 붙이고 싶은 경우테이블 구조
    create table rectb
    (a varchar(10),
      b number,
      c varchar(10))

컨트롤 화일
    load data
    infile rec.dat
    replace
    into table rectb
    fields terminated by ','
    (a char,
      b recnum,
      c char)

외부 데이타 화일
   A,a
    B,b
   C,c

검색결과
SQL>select * from rectb;

   A       B C
    ---------------------
   A       1 a
   B       2 b
   C       3 c

주의사항 : 이 예에서는 B 열은 데이타 화일에 넣어서는 안됩니다. RECNUM는 그것으로 완전한 열 지정의 하나가 됩니다. 연속번호는 1부터 차례대로 1씩 더해져서 번호가 매겨집니다. 가산된 번호를 둘씩 건너 뛰거나 하는 것은 불가능 합니다.
1.4 임의의 수치열에 연속 번호(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

주의 사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안 됩니다. SEQUENCE는 그것으로 완결된 열 지정의 하나가 됩니다. 초기 값 100과 늘인 값 5는 다른 수치로 변경 가능합니다.

1.5 로드하는 논리 레코드를 구성하는 물리 레코드가 복수열로 구성된 경우
     (물리 레코드의 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 바이트 째부터 시작해서는 안됩니다. 상기 예의 경우,  레코드의 선두 바이트가 '%'일 때 다음의 레코드가 연결됩니다.

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


테이블 구조
    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

주의사항 : 하나의 논리 레코드가 모두 일정한 갯수의 물리 레코드로부터 성립되는 것 같은 단순한 경우에 한합니다.

1.7 데이타의 잘린 문자를 데이타로 로드하고 싶은 경우테 이블 구조
    create table enc
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
     infile enc.dat
    replace
    into table enc
    fields terminated by ',' optionally enclosed by ' " ' and ' " '
    (a char,
      b char,
      c char)

외부 데이타 화일
  "abc,d",2,3
   "a,,d",4,5

검색결과
  SQL>select * from enc;

    A       B       C
    -------------------------
    abc,d   2       3
    a,,d    4       5

1.8 포지션 지정 시 char 형 데이타 전후의 blank도 로드하고 싶은 경우테이블 구조
    create table pretb
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
    infile pre.dat
    replace
     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

1.9 어떤 데이타 열의 데이타 유무와 상관없이 데이타가 없는 경우 NULL 데이타를  넣도록 하고 싶다테 이블 구조
    create table tratb
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
    infile tra.dat
    replace
    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 레코드째가 데이타 에러가 됩니다. 데이타가 들어 있기도 하고 없기도 한 열의 데이타는 데이타 화일의 최후로 가져갑니다.

1.10  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

주의 사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.

1.11 DATE 필드가 BLANK로 채워져 있을 때 NULL을 삽입하고 싶은 경우**** 테이블 구조 ****
create table nulltb2
(a varchar(10),
b varchar(10),
c date)

**** 콘트롤 화일 ****
load data
infile null2.dat
replace
into table nulltb2
fields terminated by ','
(a char,
b char,
c date "YY/MM/DD" nullif c = blanks)

**** 외부 데이타 화일 ****
aa,bb, ,
11,22, ,
99,88,92/11/11,
00,00,94/12/12,

**** 검색결과 ****
SQL>select * from nulltb2;

A       B       C
-------------------------
aa      bb
11      22
99      88      92/11/11
00      00      94/12/12

주의사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.
1.12 POSITION 지정 시 BLANK를 그대로 로드하고 싶은 경우**** 테이블 구조 ****
create table nulltb2
(a varchar(10),
b varchar(10),
c date)

**** 콘트롤 화일 ****
--- position 지정으로 블랭크를 그대로 입력 원하는 경우
--- preserve blanks를 지정한다.
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


주의사항 : 이 경우 2 레코드째는 A에 블랭크가 들어가고 B에 NULL이 들어갑니다.

1.13 데이타 화일의 수치 데이타 열에 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

1.14 데이타가 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 인터페이스를 경유하지 않기 때문에 사용할 수 없습니다.

1.15 어떤 열을 모두 대문자(소문자)로 변환하여 로드하고 싶은 경우**** 테이블 구조 ****
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

1.16 ZONE 형 데이타를 로드하고 싶은 경우ZONE 의 데이타 형식은 1문자 1바이트로 나타납니다.

숫자 +123이라면

bit     1234    5678    1234    5678    1234    5678
        1111    0001    1111    0010    1100    0011
10진            1               2         +        3             

최후의 8비트의 상위 4비트(부호비트)로 정부가 지정됩니다.

       1100(정) 1101(부)

가 됩니다.

원래는 EBCDIC코드에서

Hex F0 to F9  →  +0 to +9
Hex C0 to C9  →  +0 to +9(부호비트)
Hex D0 to D9  →  +0 to -9(부호비트)

이것을 아스키로 변환했기 때문에

부호비트        {ABCDEFGHI}JKLMNOPQR
------------------------------------
부 호            ++++++++++----------
수              01234567890123456789

가 됩니다.

**** 테이블 구조 ****
create table z
(a varchar(10),
i number,
j number)

**** 콘트롤 화일 ****
load data
infile filename.dat
replace
into table z
(a position (01) char,
i position(02:07) zoned(6),
j position(08:13) zoned(6))

**** 외부 데이타 화일 ****
A12345{12345}

**** 검색결과 ****
SQL>select * from z;

A            I        J
-----------------------
A       123450  -123450

1.17 decimal 형 데이타를 로드하고 싶은 경우decimal 데이타는 1바이트에 2개의 숫자가 지정됩니다.

숫자 +123 이라면

bit    1234 5678 1234 5678
       0001 0010 0011 1100
10진      1    2    3    +

끝의 4비트는 부호비트로 불리고

     1100(정)        1101(부)

가 됩니다.

**** 테이블 구조 ****
create table dec
(a varchar(10),
col1 number,
col2 number)

**** 콘트롤 화일 ****
load data
infile filename.dat
replace
into table dec
(a position (01:01) char,
col1 position(02:05) decimal(7,4),
col2 position(06:09) decimal(7,4))

**** 외부 데이타 화일 ****
데이타화일은 바이너리이기 때문에 more 등으로 볼 수 없습니다.

4112 3456 7c12 3456 7d0a

**** 검색결과 ****
SQL>select * from dec;

A               COL1        COL2
--------------------------------
A           123.4567   -123.4567


주 의 사항 :콘트롤 화일에서 decimal 형을 사용하는 것에 따라 (length, scale)을 지정합니다.

1.18 고정 길이 레코드 데이타를 로드하고 싶은 경우**** 테이블 구조 ****
create table fixtb
(a varchar(10),
b varchar(10))

**** 콘트롤 화일 ****
load data
infile fix.dat
"FIX 6"
replace
into table fixtb
(a char(3),
b char(3))

**** 외부 데이타 화일 ****
123456abcdef

**** 외부 데이타 화일(16진) ****
3132 3334 3536 6162 6364 6566

**** 검색결과 ****
SQL>select * from fixtb;

A      B
---------------
123    456
abc    def


주 의 사항 : 데이타 화일의 끝에는 OxOa(CARRIAGE RETURN)가 들어가면  안 됩니다. OxOa도 1문자로 카운트되기 때문입니다.
 by 꾸술 | 2006/10/25 10:11 | 백업&리커버리 | 트랙백 | 덧글(3)
트랙백 주소 : http://nhmjh.egloos.com/tb/1438719

2012-09-16

DBMS/오라클]SQL*Loader 사용법


문법
      SQLLDR [keyword=] value  [ [keyword=] value ]...
예제
      SQLLDR scott/tiger control='c:\xxx.ctl' log='xxx.log' direct=true
키워드
  USERID
  오라클 사용자 이름과 암호를 지정 합니다.

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

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

  BAD
  거 부된 레코드 모두를 저장하는 배드 파일 이름을 지정 합니다.

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

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

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

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

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

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

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

  FILE
  병렬 DIRECT로드의 경우 임시 세그먼트가 생성될 파일을 지정 합니다.
① SAMPLE TABLE 생성
-------------------------------------------------------------------------
CREATE TABLE TMP(
    SEQ_NUM     VARCHAR2(10) ,
    UNIQ_KEY    CHAR(7) ,
    RECORD_NUM  NUMBER(7,0),
    ISS_TIME    DATE,
    IF_STTS     CHAR(2),
    MEMO        VARCHAR2(100)
)
/
② SAMPLE 시퀀스 생성
-------------------------------------------------------------------------
CREATE SEQUENCE TMP_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 10000000000000000
NOMINVALUE
CYCLE
CACHE 20
NOORDER
/
③ SAMPLE 데이터 파일 생성
-------------------------------------------------------------------------
C:\S_DATAFILE.DAT
      120060123125959MEMO1
     2220060124125959MEMO2
    33320060125125959MEMO3
④ SAMPLE SQLLOADER CONTROLFILE 생성
-------------------------------------------------------------------------
C:\S_DATAFILE.CTL
Options (Rows = 1000)
Load DATA
INFILE     'C:\S_DATAFILE.DAT'
BADFILE  'C:\S_DATAFILE.BAD'
APPEND
    INTO TABLE TMP (
        --  SEQ_NUM컬럼의 최대값  +1을 대입
        SEQ_NUM            SEQUENCE(MAX,1) ,
        --  시퀀스 TMP_SEQ의 다음할당값 대입
        UNIQ_KEY            TMP_SEQ.NEXSVAL ,
        RECORD_NUM      POSITION( 1 : 7   ) DECIMAL EXTERNAL ,
        ISS_TIME             POSITION( 8 : 21 ) DATE "YYYY/MM/DD HH:MI:SS" ,
        IF_STTS               CONSTANT "00" ,
        MEMO                 POSITION( 22 : 116   ) CHAR
    )
⑤ SQLLOADER 실행
-------------------------------------------------------------------------
C:>sqlldr
 scott/tiger@XXXcontrol = C:\S_DATAFILE.CTL
//-----------------------------------------------------------------------------
sqlloader를 사용하기 위해서는 미리 테이블이 만들어져 있어야 함.

sqlloader 화일 샘플

#!/bin/csh
if ( $#argv != 2) then
    echo "Usage: $0 <DataFile> <logFileName>"
    exit 1
endif

sqlldr userid=oracle/oracle control=tblmacs_tmpidrlog.ctl data=$1 log=$2.log commit_discontinued=true

data는 raw데이타 들어갈 부분, log는 생략해도 무방..., commit으로 시작하는 부분도 생략가능

실행방법

sqlloader.sh "실제데이타 화일"
ex) sqlloader.sh  SWBLS1_FWEBIDR1_ID0001_T20030603000109.DAT

이런식으로 사용 가능(원격폴더 지정시)
## sqlloader.sh /bear02/macslog/20030401/SWBLS1_FWEBIDR1_ID0001_T20030401000110.DAT /bear01/brewlog/src/eshock/log/z0000

control화일 샘플

load data
INFILE *
append
into table TBLMACS_TMPIDRLOG
when RECORD_TYPE='R'
(
        RECORD_TYPE position(01:01) char
       ,RECORD_SEQ  position(02:08) char
       ,SVC_TYPE    position(09:09) char
       ,CALL_NUM    position(10:20) char
       ,CHARGE_NUM  position(21:31) char
       ,CP_NO       position(32:36) char
       ,CONTENTS_NO position(37:38) char
       ,MENU_NO     position(39:40) char
       ,CALL_START  position(41:54) char
       ,DURATION    position(55:63) char
       ,PKT_CNT     position(64:72) char
       ,PHONE_TYPE  position(73:87) char
       ,BROWSER_VER position(88:102) char
)

position은 순서대로 1부터 1까지 자름, 그다음 2칸째부터 8칸 이후까지를 의미함.





[ SQL*Loader 사용하기 ]
작성일자 : 2001년 6월 11일
작 성 자 : 조수환


1. SQL*Loader를 이용해서 Data를 넣을 파일을 Excel에서 생성한다.
        - 파일을 *.csv로 저장을 한다.
          (SQL*Loader 를 사용하기 위해서는 ,(콤마)가 필요하다)
        즉, 다음과 같은 데이타 포멧이면 된다.
                10000,CEO, 등록
                10020,CEO CEO실,등록
                150000,솔루션사업부 문,등록
                150010,솔루션사업부문 신프라팀,등록
                150020, 솔루션사업부문 기관영업팀,등록
                150030,솔루션사업부문 사업지원팀,등록
                150040, 솔루션사업부문 CS팀,등록

2. csv 파일에는 departcode, departname, gubun 의 형식을 데이타가 들어가 있다.

        Ex>        departcode,         departname,         gubun
                ---------- ------------------------------
                   180040         경영전략부문         홍보팀
                   190000         재경부문
                   190010         재경부문         재경기획팀
                   190020         재경부문         재경팀
                   190030         재경부문         물류지원팀
                   200000         인재기획실


3. Data를 넣을 테이블의 명세서는 다음과 같다.
        SQL> desc departinfo;
         이름       널?      유형
         ---------- -------- ------------
         ID         NOT NULL NUMBER
         DEPARTCODE              NUMBER(6)
         DEPARTNAME          VARCHAR2(40)
         CREATEDATE          DATE
         MODIFYDATE          DATE
         GUBUN               CHAR(4)
       

4. 콘트롤 파일(abc.ctl) 을 하나 만들고, 다음과 같은 내용을 기록한다.

        LOAD DATA
        INFILE '부서코드.csv'                        -- 참조할 파일은 부서코드.csv
        replace                                        -- 테이블의 내용을 모두 삭제한 후에 입력
        INTO TABLE departinfo                        -- 데이타가 들어갈 테이블 명
        fields terminated by ','                -- ,(콤마)를 기준으로 구분한다.
        (
          id                sequence(1,1),                -- 1부터 1씩 증가시킨다.
          departcode        integer external,        -- 외부의 데이타를 가져온다.
          departname        char(40),                -- 문자열은 40
          createdate        sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
          modifydate    sysdate,                -- Load를 할 때 sysdate값을 넣어준다.
          gubun        char(4)                                -- 문자열은 4
        )


5. SQL*Loader를 실행시킨다.
        # sqldlr atomx/akstp@sysora control=abc.ctl log=0611.log
        - > 위와 같이 하면 부서코드.csv의 내용이 conrolfile의 정의와 함께
            테이블에 쭉 들어간다.



< 참조> 다른 컨트롤 파일의 내용

1. 컨트롤 파일(bbb.ctl)의 내용
        LOAD DATA
        INFILE '사원인사.csv'
        replace
        INTO TABLE companyinfo
        fields terminated by ','
        (
          id                sequence(1,1),
          companycode        integer external,
          name                char(20),
          departcode        integer external,
          tel                char(4) nullif tel = blanks,        -- 만일 공백이면 NULL상태로 만든다.
          enteringdate        date ,
          createdate        sysdate,
          modifydate    sysdate,
          gubun        char(4)
        )


2. sqlldr atomx/akstp@sysora control=bbb.ctl log=0611.log
//-----------------------------------------------------------------------------------
SQL*Loader 는 외부 화일의 데이타를 ORACLE 데이타베이스의 table에 넣기 위한 유틸리티입니다. SQL*Loader를 사용하려면 외부 데이타 화일과  컨트롤 화일이 필요합니다. 컨트롤 화일이라고 하는 것은 로드하는 데이타의  정보를 저장한 화일입니다.
간단한 샘플 컨트롤 화일을 설명하겠습니다.

    load data                        제어 화일의 선두에는 반드시 이 말이 필요합니다.
    infile sample.dat              외부 화일을 지정합니다.
    replace                           테이블에 데이타 넣는 방법 지정
    into table TABLE_NAME   데이타를 로드하는 테이블을 지정
    fields terminated by ','     데이타 필드의 종결 문자 지정
    (a integer external,          테이블의 열, 외부 데이타 화일의 데이타 형을 지정
     b char)

    참고로 replace 외에 다음의 옵션이 가능합니다.

    replace                 테이블의 기존 행을 모두 삭제(delete)하고 insert
    append                 새로운 행을 기존의 데이타에 추가
    insert                   비어 있는 테이블에 넣을 때
    truncate                테이블의 기존 데이타를 모두 truncate 하고 insert

    SQL*Loader를 실행하면 아래의 화일이 작성됩니다.

    * 로드 작업 중 동작에 관한 통계 등을 포함한 로그 화일(확장자는 log)
    * 데이타 에러 때문에 로드가 안된 레코드를 저장한 화일(확장자는 bad)
    * 사용자의 선택 기준에 적합하지 않은 레코드를 저장한 화일(discard 화일)
      이것은 discardfile 옵션으로 별도로 지정해야 생성됩니다.

실 행 방법은 다음과 같습니다.

$sqlldr scott/tiger control=sample.ctl data=sample.dat
1.1 임의의 열에 변화없는 고정 문자열(값)을 입력한 경우테이블 구조
    create table cons_test
    (a number,
     b number,
     c number,
     d varchar(10))

컨 트롤 화일 (즉 이예에서 sample.ctl)
    load data
    infile cons.dat
    replace
    into table cons_test
    fields terminated by ','
    (a integer external,
     b integer external,
     c CONSTANT '100',
     d char)

외부 데이타 화일 (즉, 이예에서 sample.dat)
    1,2,DATA
    2,4,DATA2

검색결과
    SQL>select * from cons_test;

           A       B       C D
    ---------------------------------
           1       2     100 DATA
           2       4     100 DATA2

주 의사항 : 이 예에서 C열은 데이타 화일에 넣어서는 안 됩니다. COSNTANT는 그것으로 완결된 열 지정의 하나가 됩니다. integer external 데이타 형은 수치 데이타를 문자형식(ASCII CODE)로 나타낸 것입니다.
1.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

주의사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안됩니다. SYSDATE는 그것으로 완결된 열 지정의 하나가 됩니다. 새로운 시스템 날짜매김은 컨벤셔널 패스에서는 실행 시에 삽입된 각각의 레코드 배열마다 또, 다이렉트 패스의 경우는 로드된 각각의 레코드의 블럭마다 사용됩니다.
1.3 임의의 수치열에 연속 번호(sequence)를 붙이고 싶은 경우테이블 구조
    create table rectb
    (a varchar(10),
      b number,
      c varchar(10))

컨트롤 화일
    load data
    infile rec.dat
    replace
    into table rectb
    fields terminated by ','
    (a char,
      b recnum,
      c char)

외부 데이타 화일
   A,a
    B,b
   C,c

검색결과
SQL>select * from rectb;

   A       B C
    ---------------------
   A       1 a
   B       2 b
   C       3 c

주의사항 : 이 예에서는 B 열은 데이타 화일에 넣어서는 안됩니다. RECNUM는 그것으로 완전한 열 지정의 하나가 됩니다. 연속번호는 1부터 차례대로 1씩 더해져서 번호가 매겨집니다. 가산된 번호를 둘씩 건너 뛰거나 하는 것은 불가능 합니다.
1.4 임의의 수치열에 연속 번호(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

주의 사항 : 이 예에서는 B열은 데이타 화일에 넣어서는 안 됩니다. SEQUENCE는 그것으로 완결된 열 지정의 하나가 됩니다. 초기 값 100과 늘인 값 5는 다른 수치로 변경 가능합니다.

1.5 로드하는 논리 레코드를 구성하는 물리 레코드가 복수열로 구성된 경우
     (물리 레코드의 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 바이트 째부터 시작해서는 안됩니다. 상기 예의 경우,  레코드의 선두 바이트가 '%'일 때 다음의 레코드가 연결됩니다.

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


테이블 구조
    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

주의사항 : 하나의 논리 레코드가 모두 일정한 갯수의 물리 레코드로부터 성립되는 것 같은 단순한 경우에 한합니다.

1.7 데이타의 잘린 문자를 데이타로 로드하고 싶은 경우테 이블 구조
    create table enc
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
     infile enc.dat
    replace
    into table enc
    fields terminated by ',' optionally enclosed by ' " ' and ' " '
    (a char,
      b char,
      c char)

외부 데이타 화일
  "abc,d",2,3
   "a,,d",4,5

검색결과
  SQL>select * from enc;

    A       B       C
    -------------------------
    abc,d   2       3
    a,,d    4       5

1.8 포지션 지정 시 char 형 데이타 전후의 blank도 로드하고 싶은 경우테이블 구조
    create table pretb
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
    infile pre.dat
    replace
     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

1.9 어떤 데이타 열의 데이타 유무와 상관없이 데이타가 없는 경우 NULL 데이타를  넣도록 하고 싶다테 이블 구조
    create table tratb
    (a varchar(10),
      b varchar(10),
      c varchar(10))

컨트롤 화일
    load data
    infile tra.dat
    replace
    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 레코드째가 데이타 에러가 됩니다. 데이타가 들어 있기도 하고 없기도 한 열의 데이타는 데이타 화일의 최후로 가져갑니다.

1.10  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

주의 사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.
1.11 DATE 필드가 BLANK로 채워져 있을 때 NULL을 삽입하고 싶은 경우**** 테이블 구조 ****
create table nulltb2
(a varchar(10),
b varchar(10),
c date)

**** 콘트롤 화일 ****
load data
infile null2.dat
replace
into table nulltb2
fields terminated by ','
(a char,
b char,
c date "YY/MM/DD" nullif c = blanks)

**** 외부 데이타 화일 ****
aa,bb, ,
11,22, ,
99,88,92/11/11,
00,00,94/12/12,

**** 검색결과 ****
SQL>select * from nulltb2;

A       B       C
-------------------------
aa      bb
11      22
99      88      92/11/11
00      00      94/12/12

주의사항 : 검색결과의 1 행째, 2 행째의 열 C는 블랭크가 아니라 NULL 입니다.
1.12 POSITION 지정 시 BLANK를 그대로 로드하고 싶은 경우**** 테이블 구조 ****
create table nulltb2
(a varchar(10),
b varchar(10),
c date)

**** 콘트롤 화일 ****
--- position 지정으로 블랭크를 그대로 입력 원하는 경우
--- preserve blanks를 지정한다.
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


주의사항 : 이 경우 2 레코드째는 A에 블랭크가 들어가고 B에 NULL이 들어갑니다.

1.13 데이타 화일의 수치 데이타 열에 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

1.14 데이타가 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 인터페이스를 경유하지 않기 때문에 사용할 수 없습니다.

1.15 어떤 열을 모두 대문자(소문자)로 변환하여 로드하고 싶은 경우**** 테이블 구조 ****
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

1.16 ZONE 형 데이타를 로드하고 싶은 경우ZONE 의 데이타 형식은 1문자 1바이트로 나타납니다.

숫자 +123이라면

bit     1234    5678    1234    5678    1234    5678
        1111    0001    1111    0010    1100    0011
10진            1               2         +        3              

최후의 8비트의 상위 4비트(부호비트)로 정부가 지정됩니다.

       1100(정) 1101(부)

가 됩니다.

원래는 EBCDIC코드에서

Hex F0 to F9  →  +0 to +9
Hex C0 to C9  →  +0 to +9(부호비트)
Hex D0 to D9  →  +0 to -9(부호비트)

이것을 아스키로 변환했기 때문에

부호비트        {ABCDEFGHI}JKLMNOPQR
------------------------------------
부 호            ++++++++++----------
수              01234567890123456789

가 됩니다.

**** 테이블 구조 ****
create table z
(a varchar(10),
i number,
j number)

**** 콘트롤 화일 ****
load data
infile filename.dat
replace
into table z
(a position (01) char,
i position(02:07) zoned(6),
j position(08:13) zoned(6))

**** 외부 데이타 화일 ****
A12345{12345}

**** 검색결과 ****
SQL>select * from z;

A            I        J
-----------------------
A       123450  -123450

1.17 decimal 형 데이타를 로드하고 싶은 경우decimal 데이타는 1바이트에 2개의 숫자가 지정됩니다.

숫자 +123 이라면

bit    1234 5678 1234 5678
       0001 0010 0011 1100
10진      1    2    3    +

끝의 4비트는 부호비트로 불리고

     1100(정)        1101(부)

가 됩니다.

**** 테이블 구조 ****
create table dec
(a varchar(10),
col1 number,
col2 number)

**** 콘트롤 화일 ****
load data
infile filename.dat
replace
into table dec
(a position (01:01) char,
col1 position(02:05) decimal(7,4),
col2 position(06:09) decimal(7,4))

**** 외부 데이타 화일 ****
데이타화일은 바이너리이기 때문에 more 등으로 볼 수 없습니다.

4112 3456 7c12 3456 7d0a

**** 검색결과 ****
SQL>select * from dec;

A               COL1        COL2
--------------------------------
A           123.4567   -123.4567


주 의 사항 :콘트롤 화일에서 decimal 형을 사용하는 것에 따라 (length, scale)을 지정합니다.

1.18 고정 길이 레코드 데이타를 로드하고 싶은 경우**** 테이블 구조 ****
create table fixtb
(a varchar(10),
b varchar(10))

**** 콘트롤 화일 ****
load data
infile fix.dat
"FIX 6"
replace
into table fixtb
(a char(3),
b char(3))

**** 외부 데이타 화일 ****
123456abcdef

**** 외부 데이타 화일(16진) ****
3132 3334 3536 6162 6364 6566

**** 검색결과 ****
SQL>select * from fixtb;

A      B
---------------
123    456
abc    def


주 의 사항 : 데이타 화일의 끝에는 OxOa(CARRIAGE RETURN)가 들어가면  안 됩니다. OxOa도 1문자로 카운트되기 때문입니다.