SSISO Community

시소당

SQL Loader를 이용해서 csv파일 테이블에 Insert

SQL Loader라는 툴은 오라클을 설치하면 사용할 수가 있는 툴이다.

서버또는 클라이언트를 설치시 사용자 설치에서 선택해서 설치하거나 풀 옵션으로 설치하면 된다.

 

SQL Loader는 csv파일안의 내용을 테이블에 추가할때 유용하게 사용할 수가 있다.

PreparedStatement를 사용해서 executeBatch()명령을 이용해서 파일안의 내용을 추가할 수도 있지만 경우에 따라서는 SQL Loader를 이용하는 방법도 좋은 대안이 될 수 있다.

 

참고로 파일에서 10000건의 데이타를 EMP 테이블에 insert시 excuteBatch가 더 빨랐다.

 

사용방법은

control file : 데이타 적재를 위한 제어 파일 (필수)
data file    : 데이타를 담고 있는 파일(필수)
log file     : 로그 파일(필수)
bad file     : 적재되지 못한 데이타들
discard file : 적재되지 못한 데이타들에 대한 정보를 저장

위의 파일을 만들어야 합니다.

 

명령은

sqlldr scott/tiger control= control파일명.cti  log=log파일명.log data=data파일명.csv

scott/tiger는 디비접속정보입니다. 아이디와 암호죠.

옵션을 생략하면 디폴트 값으로 실행이 됩니다. errors는 50으로 되어있죠. 만약 대량의 정보를 추가시 에러가 50이상이 발생하면 sqlldr에러가 초과된 부분에서 작업을 빠져나옵니다. 넉넉히 잡아주세요.

 

 

자 이제 control파일을 만드는 방법입니다.

LOAD DATA
INFILE Test.cti -> Control 파일명

APPEND -> 명령구분
INTO TABLE EMP -> 테이블

FIELDS TERMINATED BY ',' -> csv파일안의 데이터들의 구분자

TRAILING NULLCOLS -- 널값 허용

( EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO ) -> insert되는 필드

 

명령구분은

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


참고:

http://intranet.warevalley.com/manual/Oracle816OnlineManual/server.816/a76955/ch04.htm


 프로젝트를 하다보면 파일을 읽어서 인서트하는 작업이 수초에 끝나지 않고 작업중이라는 메세지를 모달창으로 계속해서 보여주면서 사용자가 그 작업이 끝날동안 대기를 해야할 경우도 있다..

이럴때 파일을 읽어서 인서트하는 작업을 하는 클래스를 메인메소드를 가지고 있는 클래스로 만들어서 이 클래스를 runtime.exec(" java 해당 클래스명 .. ")으로 실행시키고 상태를 등록중으로 바꿔주고 해당 메소드를 빠져나가게 해놓으면 사용자는 다른 작업을 계속 할 수있을 것이다. 파일등록작업은 백그라운드로 실행이 되고 있다. 작업이 완료되면 디비 상태를 완료로 바꿔준다.

 

   javaCmd.append(" java SqlLoader "); //sqlLoader클래스 실행명령문
   ..

   sql.append(" insert into ").append( tableNm ); //디비상태를 등록
   ..      

   Properties prop = new Properties();

   //팩키지의 상위 폴더를 가지고 있는 정보 NoDefClass.. Exception이 안나게 하기 위해
   prop.load( new FileInputStream( propFile ) );             
   Runtime rt = Runtime.getRuntime();            

   //백그라운드로 java명령 실행
   Process ps = rt.exec( javaCmd.toString(), null, new File(prop.getProperty("ClassHome")) );

 

첨부파일은 SQLLoader를 클래스로 만들어 control파일을 동적으로 만들어서 공통모듈로 사용할수 있도록 했다.

2032 view

4.0 stars