关键字:oracle import export csv fixed-length sql*loader control file
Revisions:2011-06-15 24:00 追加更新功能3。
最近某Member担当了Sybase导出为CSV导入Oracle的Ticket,纠结于CSV导入到Oracle时的数据格式化,以及手写CTL文件出现的五花八门的错误。于是,我给其弄了一个Excel Macro的小工具:SQL*Loader Helper。
目前SQL*Loader Helper主要有3个功能,其一:生成Oracle Table导出CSV的SQL文件,其二:生成CSV导入Oracle Table的CTL控制文件,其三:生成Fixed-Length记录文件导入Oracle Table的CTL控制文件。
如下图sample Sheet例子:
按下<Make Export-CSV SQL>按钮,生成的emp_out.sql文件长这样:
set heading off set feedback off set trimspool on set termout off set echo off set pages 0 set line 9999 spool c:\emp.csv select 'EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO' from dual; select EMPNO ||','|| ENAME ||','|| JOB ||','|| MGR ||','|| TO_CHAR(HIREDATE,'YYYY/MM/DD HH24:MI:SS') ||','|| SAL ||','|| COMM ||','|| DEPTNO from EMP order by EMPNO; spool off
执行sqlplus scott/tiger @ emp_out.sql就可以拿到emp.csv。
按下<Make CSV-IN CTL File>按钮,生成的emp_in.ctl文件长这样:
OPTIONS(SKIP=1,LOAD=-1,ERRORS=-1,ROWS=2) LOAD DATA INFILE 'c:\emp.csv' BADFILE 'c:\emp.bad' TRUNCATE INTO TABLE EMP FIELDS TERMINATED BY ',' TRAILING NULLCOLS ( EMPNO, ENAME, JOB, MGR, HIREDATE "TO_DATE(:HIREDATE,'YYYY/MM/DD HH24:MI:SS')", SAL, COMM, DEPTNO )
执行sqlldr scott/tiger control=emp_in.ctl就可以导入CSV为Table Records。
按下<Make DATA-IN CTL File(Fixed-Length)>按钮,生成的emp_fix_in.ctl文件长这样:
OPTIONS(ERRORS=-1,ROWS=-1) LOAD DATA INFILE 'c:\emp.txt' BADFILE 'c:\emp.bad' APPEND INTO TABLE EMP TRAILING NULLCOLS ( EMPNO POSITION( 1 : 4 ) DECIMAL EXTERNAL, ENAME POSITION( 5 : 14 ) CHAR, JOB POSITION( 15 : 23 ) CHAR, MGR POSITION( 24 : 27 ) DECIMAL EXTERNAL, HIREDATE POSITION( 28 : 35 ) DATE "YYYYMMDD", SAL POSITION( 36 : 42 ) ZONED(7,2), COMM POSITION( 43 : 49 ) CHAR "decode(:COMM,'',null,to_number(:COMM))", DEPTNO POSITION( 50 : 51 ) DECIMAL EXTERNAL )
测试用emp.txt长这样:
9001TEST1 JOB1 2011061524001234567 30 9002TEST2 JOB2 2011061524001234567 12330
执行sqlldr scott/tiger control=emp_fix_in.ctl就可以导入emp.txt为Table Records。
以上Windows XP + Oracle 9.2.0.1.0 实验通过。
好吧,罗嗦了。readme Sheet里面有详尽的Chinglish解释。
SQL*Loader Helper附件已删除,想要的请留下email。
个人翻译整理测试成文,主要参考:
Oracleメモ(Hishidama's Oracle Memo)
SQL*Loader Field List Reference
※转载请Mail:Nanigac.Yin#Gmail.COM,谢谢。