SQL*Loader 사용하기
오라클/SQL/SQL공부
1. SQL*Loader란 ?
외부 화일에 있는 데이터를 Oracle에 Upload 할 수 있는 유틸리티 입니다.
기본적으로 외부 데이타 화일, 콘트롤화일(로드하는 데이타의 정보를 저장)이 필요합니다.
2. SQL*Loader 특징
- 하나 이상의 입력 파일을 사용 가능
- 로드를 위해 여러 개의 입력 레코드가 하나의 논리적 레코드로 결합될 수 있습니다..
- 입력 필드는 고정 길이 또는 다양한 길이를 가질 수 있습니다.
- 입력 데이터는 등 어떤 유형도 가능 합니다.
- 데이터는 디스크/테이프/명명된 파이프 등 여러 유형의 매체로부터 로드 가능
- 데이터가 한 번에 여러 테이블로 로드 가능
- 텍스트 데이터는 DB 버퍼 캐쉬를 거치지 않고 테이블로 직접 로드될 수 있다.
- 테이블에 있는 기존 데이터를 대체 하거나(Replace) 추가(Append) 할 수 있는 기능이 있습니다.
3. SQL*Loader의 사용
기본문법 : SQLLDR [keyword=] value [ [keyword=] value ]...
- KEYWORD : 아래에 설명되는 키워드중의 하나이며 VALUE는 키워드에 지정되는 값
실행예)
SQLLDR userid=scott/tiger control='test.ctl' log='test.log'
키워드
•USERID : 사용자 ID와 암호
•CONTROL : 콘트롤 파일명
•LOG : 로그 파일명(기본 이름은 컨트롤파일명.log)
•BAD : 업로드에 실패한 레코드들이 저장 된다.(기본 이름은 컨트롤파일명.bad)
•DATA : 업로드를 위한 데이터 파일 이름
•DISCARD : 선택되지 않은 레코드가 저장되는 디스카드 파일(선택 사항)
•DISCARDMAX : 버림(discard)의 최대 허용 갯수(기본값은 모든 버림을 허용하는 것입니다. 잘못된 입력 파일이 지정될 경우 실행을 중단시킬 안전 수단으로 사용)
•SKIP : 건너 뛸 레코드 수, 주로 이전에 실패한 로드를 계속할 때 사용됨(한 테이블로 로드할 때나 로드되고 있는 모든 테이블에 대해 동일한 수의 레코드를 건너 뛸 때만 이 옵션을 사용)
•LOAD : SKIP에 의해 지정된 레코드를 건너 뛴 다음 로드할 레코드 수를 지정
•ERRORS : 배드 레코드의 최대 수
•ROWS : conventional 로드의 경우 각 삽입 전에 배열에 구축될 행의 수 지정(direct path로드의 경우 이 키워드는 각 data save마다 입력으로부터 읽어들일 행의 근사 수를 정의, Direct로드는 data save 전에 완전한 블록을 구축하고 버릴 행과 부적합한 행을거부한다.)
•BINDSIZE : conventional 로드의 경우 각 데이터베이스 호출시 삽입될 행의 배열을 구축하는데 사용될 최대 바이트 수를 지정(ROWS 파라미터도 지정되면 SQL*Loader는 BINDSIZE의 제한에 따라 ROWS에 의해 정의된 만큼의 행을 구축합니다.)
•DIRECT : TRUE로 설정되면 SQL*Loader는 direct path를 사용. 반대의 경우는 기본 값인 conventional path 사용.
•PARFILE : 모든 로드 파라미터를 포함하고 있는 파일의 이름을 지정(명령 라인에 정의된 파라미터는 파라미터 파일에 정의된 값들을 무효화합니다.)
•PARALLEL : direct 로드에서만 적합한 이 파라미터는 다중 병렬 direct 로드가 수행되도록 지원
•FILE : 병렬 direct 로드의 경우 임시 세그먼트가 생성될 파일을 지정
--------------------------------------------------------------------------------
Control File 예(Control File에서 데이터를 포함 할 경우)
LOAD DATA
INFILE *
REPLACE
INTO TABLE mydept <-- 오라클의 테이블 이름
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO, DNAME)
BEGINDATA
40,SALES
50,"RESEARCH"
60,"ART"
참고 :
- Control File에서 데이터를 포함하지 않을 경우에는 INFILE 다음에 DATA파일을 지
정하고 BEGINDATA 부터 생략 하면 된다.
- NOLOGGING 키워드를 사용하여 테이블에 NOLOG 속성을 설정하는 것과 콘트롤
파일에 UNRECOVERABLE 옵션을 사용하는 것은 서로 같다.
6. Data File
① 콘트롤 파일에서 정의된 형식의 입력을 위한 데이터가 있다.
② UpLoad될 데이터를 Control File에 정의 할 수도 있고 Data File에 따로 분리 할 수도
있다.
7. Log File
- 로드 시작/종료 시간, 총로드시간등 정보를 제공
- Load상태 정보를 저장
-로드된 행의 수, 에러로 인해 로드가 거부된 행의 수, 버려진(Discard) 행의 수등의
정보를 제공 한다.
출처 : ONJ프로그래밍 (http://www.onjprogramming.co.kr)
--------------------------------------------------------------------------------
(예제)
1. 연습용 테이블 생성
SQL> create table bbangmi_list(
2 bbang_no number not null primary key,
3 food varchar2(30) not null,
4 when varchar2(4)
5 );
테이블이 생성되었습니다.
--------------------------------------------------------------------------------
2. 제어파일 데이터가 들어있는 경우
(C:\Documents and Settings\onj에 저장했다)
myfood.ctl파일을 만들었다.
LOAD DATA
INFILE *
INTO TABLE bbangmi_list
FIELDS TERMINATED BY','
(BBANG_NO, FOOD, WHEN)
BEGINDATA
10, 떡볶이, 간식
20, 피자, 저녁
30, 치킨, 점심
40, 맥주, 아침
50, 커피, 아침
3. 실행
C:\Documents and Settings\onj>sqlldr userid=scott/tiger control = 'myfood.ctl'
SQL*Loader: Release 11.2.0.1.0 - Production on 금 8월 2 15:47:22 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
커밋 시점에 도달 - 논리 레코드 개수 5
4. 데이터 insert 실행여부 확인
(저장폴더에는 이제 myfood.log가 생성되어있다.)
SQL> connect scott/tiger
SQL> select*from bbangmi_list;
BBANG_NO FOOD WHEN
---------- ------------------------------ ----
10 떡볶이 간식
20 피자 저녁
30 치킨 점심
40 맥주 아침
50 커피 아침
--------------------------------------------------------------------------------
2. 제어파일과 데이터 파일이 분리된 경우
#. control file 부분 : food.ctl저장
#. DATA : food.dat저장
@ food.ctl 내용
LOAD DATA
INFILE 'food.dat'
APPEND
INTO TABLE bbangmi_list
FIELDS TERMINATED BY ','
(bbangmi_no,food,when)
--------------------------------------------------------------------------------
@ food.data 내용
60,금식,안돼
20,초콜렛,간식
10,콜라,저녁
(**주의!! data 파일에 빈칸이 있으면 자료가 안들어가 ㅠㅜㅠㅜㅠㅜㅠㅜ
예: 60, 금식, 안돼 nononono!!!
바른 답 : 60,금식,안돼 goooooooooood!!!
3. 실행
C:\Documents and Settings\onj>sqlldr userid=scott/tiger control = 'food.ctl'
SQL*Loader: Release 11.2.0.1.0 - Production on 금 8월 2 15:57:29 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
커밋 시점에 도달 - 논리 레코드 개수 2
커밋 시점에 도달 - 논리 레코드 개수 3
(dir확인)
2013-08-02 오후 03:57 56 food.bad
2013-08-02 오후 03:55 110 food.ctl
2013-08-02 오후 03:56 54 food.DAT
2013-08-02 오후 03:57 1,972 food.log
2013-08-02 오후 12:08 1,455,095,808 full.dmp
2013-08-01 오전 11:20 <DIR> My Documents
2013-08-02 오후 02:26 157 mydept.ctl
2013-08-02 오후 02:26 1,537 mydept.log
2013-06-22 오후 03:31 923,430,912 myemp.dmp
2013-08-02 오후 03:46 179 myfood.ctl
2013-08-02 오후 03:47 1,549 myfood.log
2013-06-15 오전 11:22 <DIR> Oracle
2013-08-02 오전 11:34 1,455,095,808 scott.dmp
2013-06-22 오전 10:32 4,096 scott.emp
2013-07-18 오후 03:01 0 select
2013-07-18 오후 03:02 0 spool
2013-08-02 오전 11:44 8,192 structure.dmp
2013-07-18 오후 05:30 0 test.sql
2013-08-02 오전 10:16 <DIR> 바탕 화면
2011-07-25 오후 03:41 <DIR> 시작 메뉴
34개 파일 5,289,240,626 바이트
7개 디렉터리 77,600,690,176 바이트 남음
food.bad 파일이 생성됨 :
----내용----
20,초콜렛,간식
10,콜라,저녁
------------
(해석) BAD파일이 생긴 이유는 이미 기존에 위의 실습을 통해 10, 20, 30번,40번,50번은 저장 되어 있는 상태.
그러므로 APPEND 되는 10, 20, 60 번중에서 10, 20번을 가진 데이터는 DISCARD 되는 것
(bbang_no 가 Primary Key)
4. 데이터 insert 여부 확인
SQL> select * from bbangmi_list;
BBANG_NO FOOD WHEN
---------- ------------------------------ ----
10 떡볶이 간식
20 피자 저녁
30 치킨 점심
40 맥주 아침
50 커피 아침
60 금식 안돼
6 개의 행이 선택되었습니다.