如何导出Oracle中的数据到文本文件?
在Oracle中你找不到来完成这个功能的工具. 我以前曾经用PowerBuilder的数据管道来完成这个任务,
后来在AskTom上看到有两个工具, 其中一个是用SQL*Plus的SPOOL命令来做的,
另一个是用Pro*C程序来写的. 用SQL*Plus的那种方法要比Pro*C的慢一些, 但是Pro*C因为和Oracle的版本结合太紧密,
不同的客户端版本需要重新编译, 因此在有不同版本的Oracle的环境下使用时不太方便. 几个月前, 我正在学习使用Oracle客户端的C程序接口(OCI)来编写数据库交互程序, 就用写一个这样的工具来作为练习题,
最后完成了任务, 并且在Linux/Unix下的不同的Oracle客户端版本下也不需要重新编译程序(在8i/9i/10g)的客户端下试过了.
这个工具可以免费下载, 在下载的文件中包括了Windows, Linux, Solaris下的可执行文件.
来看一下这个工具的命令行选项:
Usage: ociuldr user=... query=... field=... record=... file=...
(@) Copyright Lou Fangxin 2004/2005, all rights reserved.
Notes:
-si = enable logon as SYSDBA
user = username/password@tnsname
sql = SQL file name, one sql per file, do not include ";"
query = select statement
field = seperator string between fields
record= seperator string between records
file = output file name(default: uldrdata.txt)
read = set DB_FILE_MULTIBLOCK_READ_COUNT at session level
sort = set SORT_AREA_SIZE & SORT_AREA_RETAINED_SIZE at session level (UNIT:MB)
hash = set HASH_AREA_SIZE at session level (UNIT:MB)
serial= set _serial_direct_read to TRUE at session level
trace = set event 10046 to given level at session level
for field and record, you can use '0x' to specify hex character code,
\r=0x0d \n=0x0a |=0x7c ,=0x2c \t=0x09
其中read/sort/hash三个命令行选项是用来优化用的. 下面的例子用"#"来作为字段间的分隔符, 用换行作为记录的分隔符:
C:\ociuldr user=anysql/anysql@prod query="select * from tab" field=# record=0x0a file=anysql_tab.txt
3100 bytes allocated for column TNAME (1)
800 bytes allocated for column TABTYPE (2)
4100 bytes allocated for column CLUSTERID (3)
0 rows exported at 2006-08-03 10:54:38
12 rows exported at 2006-08-03 10:54:38
C:\>type anysql_tab.txt
AULEXT#TABLE#
A_SEQ_SYN#SYNONYM#
A_V#VIEW#
OBJD_LIST#TABLE#
T#TABLE#
TRANSACTION_CACHE_IOT_0#TABLE#
T_HASH#TABLE#
T_LOB#TABLE#
T_LONG#TABLE#
T_LONGRAW#TABLE#
T_TRUNC2#TABLE#
T_TRUNC4#TABLE#
这个工具用100大小的数组来从服务器端取得记录, 从儿保证了这个工具的良好性能.
现在的版本中还没有自动生成用SQL Loader来装载数据用的控制文件, 下一次更新将包括这个功能,
在Linux/Unix下使用时需要设置三个环境变量:
- ORACLE_HOME
- NLS_LANG
- LD_LIBRARY_PATH, 需要指向32位的客户端库
有什么好的建议, 请你告诉我!