oracle导成文本格式

在Oracle中你找不到来完成这个功能的工具. 我以前曾经用PowerBuilder的数据管道来完成这个任务, 后来在AskTom上看到有两个工具, 其中一个是用SQL*Plus的SPOOL命令来做的, 另一个是用Pro*C程序来写的. 用SQL*Plus的那种方法要比Pro*C的慢一些, 但是Pro*C因为和:

[@more@]

如何导出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="|" file=anysql_tab.txt table=d_risk
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下使用时需要设置三个环境变量:

使用ociuldr导出date类型的数据

在使用ociuldr工具的时候,为了导出date类型的字段,最好使用to_char函数把date类型的字段转为你需要的字段如('yyyy-mm

-dd hh24:mi:ss')。有这样一个表结构:
Name Type Nullable Default Comments
----------- -------------- -------- ------- ---------------------
ID NUMBER Y
NAME VARCHAR2(20) Y
AGE NUMBER Y
DESCRIPTION NVARCHAR2(100) Y
BIRTHDAY DATE

有记录:
1 小明 10 淘气的孩子 1997-8-8 8:08:08
2 小孙 11 爱学习的孩子 1996-8-8 9:09:09

在使用ociuldr导出数据的时候,最好写成如下(这里只关注query参数,其他的参数可以自己选择设置):
c:>ociuldr user=scada/scada@orcl query="select id,name,age,description, to_char(birthday,'yyyy-mm-dd hh24:mi:ss')as birthday from tttt" field=# record=0x0a file=D:emp1.txt table=tttt

在d:emp1.txt中的内容为:
1#小明 #10#淘气的孩子#1997-08-08 08:08:08
2#小孙#11#爱学习的孩子#1996-08-08 09:09:09

如果按照下面的方式导出数据:
c:>ociuldr user=scada/scada@orcl query="select * from tttt" field=# record=0x0a file=D:emp1.txt table=tttt

在d:emp1.txt中的内容为如下所示(只有年月日,没有时分秒):
1#小明 #10#淘气的孩子#08-8月 -97
2#小孙#11#爱学习的孩子#08-8月 -96

通过上面的分析,我们还可以知道在查询date类型的字段的时候,我们可以通过to_char的转换,转为任意格式的显示格式。
select to_char(birthday,'hh24:mi') from scada.tttt;
08:08
09:09

必须注意到在ociuldr中,把date类型的字段作为一个普通的String进行了处理。

使用sqlldr导入数据

删除tttt表中的记录通过sqlldr把导出的数据导入到tttt表中去,注意必须是第一次通过调用to_char使用yyyy-mm-dd hh24:mi:ss格式导出date类型记录.

注意: 当使用ociuldr生成控制脚本的时候,由于时间字段使用了to_char函数转换为了字符格式,因此在控制文件中date类型的字段变为了char字段,必须手动改为date,并且定义自己需要的格式.

控制文件tttt_sqlldr.ctl的内容是:
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'D:emp1.txt' "STR X'0a'"
INTO TABLE tttt
FIELDS TERMINATED BY X'23' TRAILING NULLCOLS
(
ID CHAR(40),
NAME CHAR(20),
AGE CHAR(40),
DESCRIPTION CHAR(200),
BIRTHDAY DATE "YYYY-MM-DD HH24:MI:SS"
)

在控制台命令行下运行: c:>sqlldr scada/scada@orcl control=d:tttt_sqlldr.ctl

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7490392/viewspace-1020878/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7490392/viewspace-1020878/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值