강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
SQL*LOADER 1편
조회 : 8,469  


SQL*LOADER 1편
일반 text file(오라클에서는 flat file이라고 부른다.)의 데이터를 오라클DB에
넣기 위한 방법은 2가지가 있다. 고정길이레코드를 가진 데이터와
가변길이레코드를 가진 데이터

고정길이 레코드 데이터
백지영 80  80  80
한심해 20  20  30
조신한 50  80  90
여자면 30  100 98
이런일 80  90  65
없었지 65  95  85

가변길이 레코드 데이터
myunggyu, 강명규, 750509, 남자, 프로그래머
piruks, 강병욱, 730301, 남자, 수학자
gildong, 홍길동, 700101, 남자, 도둑님

flat파일로부터 데이터를 삽입하기 위한 테이블을 생성하자.
SQL> connect kang/xxxxxx
연결되었습니다.

SQL> create table fix_table
  2  (
  3  name varchar2(6),
  4  국어 number,
  5  영어 number,
  6  수학 number
  7  );

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

SQL> create table var_table
  2  (
  3  id varchar2(15),
  4  name varchar2(10),
  5  birth char(7),
  6  sex char(5),
  7  vocation varchar2(15)
  8  );

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

SQL>

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






고정 레코드


제어파일에 데이터파일의 내용이 함께 존재할 경우


fix_togather.ctl이라는 파일의 내용이다.

load data
infile *
append into table fix_table
(
name position(1:6)   char,
국어 position(8:10)  integer external,
영어 position(12:14) integer external,
수학 position(16:19) integer external
)

begindata
백지영 80  80  80
한심해 20  20  30
조신한 50  80  90
여자면 30  100 98
이런일 80  90  65
없었지 65  95  85



OS에서 작업
아래 명령에 실행후, 결과로그가 fix_togather.log파일에 기록된다.
만일 테이블의 정의에 벗어나는 형식의 데이터(레코드)는 bad file에 저장된다.
아래와 같은 경우 fix_togather.bad라는 파일에 적합하지 않는 레코드들이 저장된다.

E:>sqlldr userid=kang/xxxxxx control=fix_togather

SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 14:59:21 2000

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

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

E:>
fix_togather.log파일의 내용

SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 14:59:21 2000

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

제어 파일:    fix_togather.ctl
데이터 파일:    fix_togather.ctl
  잘못된 파일: fix_togather.bad
  폐기 파일:    지정 사항 없음

 (모든 폐기된 레코드 허용)

로드할 건수: ALL
생략 건수:  0
허용 오류수:  50
바인드 배열:  64 행, 최대 65536 바이트
계속:    지정 사항 없음
사용된 경로:      규약

테이블 FIX_TABLE, 로드되었습니다 개개의 논리 레코드로부터
이 테이블에 적당한 Insert 옵션: APPEND

   열 이름                        위치    Len   Term Encl 데이터유형
------------------------------ ---------- ----- ---- ---- ---------------------
NAME                                  1:6     6           CHARACTER
국어                                 8:10     3           CHARACTER
영어                                12:14     3           CHARACTER
수학                                16:19     4           CHARACTER

테이블 FIX_TABLE:
  6 행들 로드되었습니다.
  데이터 오류 때문에 0 행들(이)가 로드되지 않았습니다
  모든 WHEN절이 실패하여 0 행들(이)가 로드되지 않았습니다
  모든 필드가 NULL이어서 0 행들(이)가 로드되지 않았습니다


바인드 배열에 할당된 영역:              1664바이트(64 행)
바인드 배열외에 메모리에 할당된 영역:        0 바이트

생략된 논리 레코드의 합계:         0
읽어낸 논리 레코드의 합계:         6
거부된 논리 레코드의 합계:         0
폐기된 논리 레코드의 합계:         0

목 Nov 30 14:59:21 2000에 실행 개시
목 Nov 30 14:59:26 2000에 실행 종료

경과 시간:        00:00:05.39
CPU 시간:         00:00:00.08



SQL> select * from fix_table;

NAME         국어       영어       수학
------ ---------- ---------- ----------
백지영         80         80         80
한심해         20         20         30
조신한         50         80         90
여자면         30        100         98
이런일         80         90         65
없었지         65         95         85

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

나중의 테스트를 위해 삽입된 데이터를 지운다.
SQL> delete from fix_table;

6 행이 삭제되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL>







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

제어파일(fix_data.ctl)의 내용
load data
infile 'fix_data.dat'
badfile 'fix_data.bad'
discardfile 'fix_data.dsc'
insert into table fix_table
(
name position(1:6)   char,
국어 position(8:10)  integer external,
영어 position(12:14) integer external,
수학 position(16:19) integer external
)

데이터파일(fix_data.dat)의 내용
백지영 80  80  80
한심해 20  20  30
조신한 50  80  90
여자면 30  100 98
이런일 80  90  65
없었지 65  95  85

E:>sqlldr userid=kang/xxxxxx control=fix_data

SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 15:10:49 2000

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

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

E:>

fix_data.log파일의 내용
SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 15:10:49 2000

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

제어 파일:    fix_data.ctl
데이터 파일:    fix_data.dat
  잘못된 파일: fix_data.bad
  폐기 파일:   fix_data.dsc
 (모든 폐기된 레코드 허용)

로드할 건수: ALL
생략 건수:  0
허용 오류수:  50
바인드 배열:  64 행, 최대 65536 바이트
계속:    지정 사항 없음
사용된 경로:      규약

테이블 FIX_TABLE, 로드되었습니다 개개의 논리 레코드로부터
이 테이블에 적당한 Insert 옵션: INSERT

   열 이름                        위치    Len   Term Encl 데이터유형
------------------------------ ---------- ----- ---- ---- ---------------------
NAME                                  1:6     6           CHARACTER
국어                                 8:10     3           CHARACTER
영어                                12:14     3           CHARACTER
수학                                16:19     4           CHARACTER

테이블 FIX_TABLE:
  6 행들 로드되었습니다.
  데이터 오류 때문에 0 행들(이)가 로드되지 않았습니다
  모든 WHEN절이 실패하여 0 행들(이)가 로드되지 않았습니다
  모든 필드가 NULL이어서 0 행들(이)가 로드되지 않았습니다


바인드 배열에 할당된 영역:              1664바이트(64 행)
바인드 배열외에 메모리에 할당된 영역:        0 바이트

생략된 논리 레코드의 합계:         0
읽어낸 논리 레코드의 합계:         6
거부된 논리 레코드의 합계:         0
폐기된 논리 레코드의 합계:         0

목 Nov 30 15:10:49 2000에 실행 개시
목 Nov 30 15:10:54 2000에 실행 종료

경과 시간:        00:00:04.64
CPU 시간:         00:00:00.08




가변레코드

가변길이 레코드는 필드구분자로 레코드내의 필드를 구분한다.
보통 ,로 구분자를 쓰는 경우가 많다.

제어파일에 데이터파일의 내용이 함께 존재할 경우
var_togather.ctl이라는 파일의 내용이다.

load data
infile *
append into table var_table
fields terminated by ","
( id, name, birth, sex, vocation)

begindata
myunggyu, 강명규, 750509, 남자, 프로그래머
piruks, 강병욱, 730301, 남자, 수학자
gildong, 홍길동, 700101, 남자, 도둑님

E:>sqlldr userid=kang/xxxxxx control=var_togather

SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 15:28:23 2000

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

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

E:>


SQL> select * from var_table;

ID              NAME       BIRTH   SEX   VOCATION
--------------- ---------- ------- ----- ---------------
myunggyu         강명규     750509  남자  프로그래머
piruks           강병욱     730301  남자  수학자
gildong          홍길동     700101  남자  도둑님

SQL>

마찬가지로 결과로그는 var_togather.log에 저장된다.



제어파일과 데이터파일이 분리된 경우
제어파일(var_data.ctl)의 내용
load data
infile 'var_data.dat'
badfile 'var_data.dat'
discardfile 'fix_data.dsc'
append into table var_table
fields terminated by ","
( id, name, birth, sex, vocation)



데이터파일(var_data.dat)의 내용
myunggyu, 강명규, 750509, 남자, 프로그래머
piruks, 강병욱, 730301, 남자, 수학자
gildong, 홍길동, 700101, 남자, 도둑님


위에서 삽입된 데이터들을 일단 지우자

SQL> delete from var_table;

3 행이 삭제되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL>

E:>sqlldr userid=kang/xxxxxx control=var_data

SQL*Loader: Release 8.1.6.0.0 - Production on 목 Nov 30 15:36:12 2000

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

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

E:>

SQL> select * from var_table;

ID              NAME       BIRTH   SEX   VOCATION
--------------- ---------- ------- ----- ---------------
gildong          홍길동     700101  남자  도둑님
myunggyu         강명규     750509  남자  프로그래머
piruks           강병욱     730301  남자  수학자

SQL>


SQL*LOADER 1편 끝

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=744


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
(주) 수퍼유저