怎样将数据卸载为通用格式呢?很多朋友通过select查询spool为文本文件,这种方式无疑效率很差,而且不够方便。
网友DCBA曾经开发了一个小工具──ociuldr(后经过改写更名为sqluldr2),可用于将Oracle数据转储出来,非常简单高效,而且开源。通过ociuldr转储的数据,可以很容易用SQLLDR加载入数据库,两者结合使用,效果非凡。
本文将简要介绍一个这个小工具的使用方法。
先通过以下测试,来熟悉一下这个工具的用法。
卸载命令很简单,通过table参数还可以自动生成用于SQLLDR的控制文件:
D:\>ociuldr user=scott/tiger@eygle2 query="select * from emp" file=emp.txt table=empt
0 rows exported at 2007-04-23 17:16:32
14 rows exported at 2007-04-23 17:16:32
output file emp.txt closed at 14 rows.
检查一下生成的数据文本:
D:\>type emp.txt
7369,SMITH,CLERK,7902,17-12月-80,800,,20
7499,ALLEN,SALESMAN,7698,20-2月 -81,1600,300,30
7521,WARD,SALESMAN,7698,22-2月 -81,1250,500,30
7566,JONES,MANAGER,7839,02-4月 -81,2975,,20
7654,MARTIN,SALESMAN,7698,28-9月 -81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-5月 -81,2850,,30
7782,CLARK,MANAGER,7839,09-6月 -81,2450,,10
7788,SCOTT,ANALYST,7566,19-4月 -87,3000,,20
7839,KING,PRESIDENT,,17-11月-81,5000,,10
7844,TURNER,SALESMAN,7698,08-9月 -81,1500,0,30
7876,ADAMS,CLERK,7788,23-5月 -87,1100,,20
7900,JAMES,CLERK,7698,03-12月-81,950,,30
7902,FORD,ANALYST,7566,03-12月-81,3000,,20
7934,MILLER,CLERK,7782,23-1月 -82,1300,,10
再看看自动生成的控制文件:
D:\>type empt_sqlldr.ctl
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=4194304,READSIZE=4194304,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'emp.txt' "STR X'0a'"
INTO TABLE empt
FIELDS TERMINATED BY X'2c' TRAILING NULLCOLS
(
EMPNO CHAR(40),
ENAME CHAR(10),
JOB CHAR(9),
MGR CHAR(40),
HIREDATE DATE "YYYY-MM-DD HH24:MI:SS",
SAL CHAR(40),
COMM CHAR(40),
DEPTNO CHAR(40)
)
可以尝试使用这个控制文件将数据加载到数据库中。
首先在数据库中创建好测试表:
SQL> create table empt as select * from emp where 1=0;
表已创建。
通过sqlldr加载这个文件:
D:\> sqlldr scott/tiger@eygle2 control=empt_sqlldr.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on 星期二 2月 27 16:01:24 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
达到提交点 - 逻辑记录计数 14
这样数据就加载进入了数据库中。对于大数据表的导出ociuldr工具还支持按照不同的批量导出数据,这通过一个参数batch来实现,默认一个batch是50万条记录,如果指定batch为2就表示100万条记录换一个文件,默认这个选项值是0,就是指不生成多个文件。
在指定batch选项后,需要指定file选项来定义生成的文件名,文件名中间需要包含"%d"字样,在生成文件时,"%d"会被打印成序号,请看以下一个测试:
SQL> SELECT COUNT(*) FROM T_OBJID;
COUNT(*)
----------
2430720
用如下命令进行导出,观查log输出:
C:\TEMP>ociuldr user=anysql/anysql query="select * from t_objid" batch=2 file=test_%d.txt
0 rows exported at 2006-11-23 21:09:19
500000 rows exported at 2006-11-23 21:09:20
1000000 rows exported at 2006-11-23 21:09:21
output file test_1.txt closed at 1000000 rows.
500000 rows exported at 2006-11-23 21:09:21
1000000 rows exported at 2006-11-23 21:09:22
output file test_2.txt closed at 1000000 rows.
430720 rows exported at 2006-11-23 21:09:22
output file test_3.txt closed at 430720 rows.
这个小工具及其源码可以从DCBA的网站下载:
下载链接:http://www.anysql.net/software/ociuldr.zip
也被包含在eygle博客的源码包中:
下载链接:http://www.eygle.com/orabk/step.by.step.oracle.script.zip
关键字:
SQLLDR,外部表,可写外部表,writeable external tables