본문 바로가기

Programming Practice/SQL

대용량의 데이터 한꺼번에 테이블에 집어넣기

1. 언제 사용하는가?

특정 프로그램이 여러 로직 처리 및 계산을 해서 특정 테이블에 데이터를 넣는다고 하자. 상황에 따라 특정 프로그램이 구동을 잘못해서 특정 테이블에 입력했던 데이터를 지우고, 프로그램을 통해 다시 입력해야 한다고 하자.

이때 삭제하는 내역은 반드시 여러 형태로 백업을 해놓아야 한다. (csv 파일 형태로 백업을 많이 한다.) 

프로그램을 통해 다시 데이터를 입력하는 작업이 제대로 되지 않았을 경우, 백업해놓은 데이터를 다시 테이블에 입력해야 하는데, 그때 사용할 수 있는 유용한 방법이다.


2. 어떻게 사용하는가?

1) 백업할 데이터를 csv 파일로 내린다.

이때 내리는 프로그램에 따라 csv 파일에 테이블 컬럼에 매핑되는 데이터 이외에 row number 등이 추가될 수 있는데, 테이블 컬럼에 매핑되는 데이터 이외의 값은 모두 삭제한다.

2)Control 파일을 작성한다. (확장자를 ctl로 한다.)

LOAD DATA

INFILE 'csv 파일명'

BADFILE 'bad 파일명'

DISCARDFILE 'dsc 파일명'

Append INTO TABLE EMPLOYEES_TEST

FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS

(컬럼명1, 컬럼명2(csv 파일의 컬럼 순서 고려) date 데이터 유형)

ex)

LOAD DATA

INFILE 'employees.csv'

BADFILE 'employees.bad'

DISCARDFILE 'employees.dsc'

Append INTO TABLE EMPLOYEES_TEST

FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS

(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID date 'yyyy-mm-dd')


3)SQLLoader를 실행한다.

cmd 창에서 ctl 파일이 있는 폴더로 이동한다. 아래 명령어를 친다.

sqlldr userid=id명/pw@DB명 control="컨트롤파일명.ctl" log="log파일명.log"

ex)

sqlldr userid=hr/hr@ORCL control="employees.ctl" log="employees.log"


* 참고 사이트 : http://www.oracle-dba-online.com/sql_loader.htm

SQL Loader의 본래 목적 : load data from other data source (ex. excel, access) into Oracle