« ociuldr固定长度导出 »
Tools » http://www.anysql.net/tools/ociuldr_fix_width_unload.html 2009-02-17据说sqlldr在导入固定长度的文本时, 速度可以提高很多, 也有网友想要这个功能, 想想可能我也需要这个功能, 于是就加了一下. 当指定用空格作为分隔符时, 就会变成以固定长度导出数据. 例如下面的导出命令.
ociuldr user=/ \
query="select owner,object_name from all_objects" \
field=0x20 table=test
修改了一下输出, 整个输出只有三行.
0 rows exported at 2009-02-17 17:23:31
17330 rows exported at 2009-02-17 17:23:32
output file uldrdata.txt closed at 17330 rows.
看一下输出文件中的记录, 现在已经变成等宽了. 不过这个长度只能是由程序自动设定的, 而不能人工设定各列的长度.
SYS ACCESS$
SYS AGGXMLIMP
SYS AGGXMLINPUTTYPE
SYS ALL_ALL_TABLES
SYS ALL_APPLY
SYS ALL_APPLY_CONFLICT_COLUMNS
SYS ALL_APPLY_DML_HANDLERS
SYS ALL_APPLY_ERROR
SYS ALL_APPLY_KEY_COLUMNS
SYS ALL_APPLY_PARAMETERS
SYS ALL_APPLY_PROGRESS
检查一下自动生成的控制文件, 也已经反映出了固定长度导出.
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=16777216,READSIZE=16777216,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'uldrdata.txt' "STR X'0a'"
INSERT INTO TABLE test
FIELDS TERMINATED BY X'20' TRAILING NULLCOLS
(
OWNER POSITION(1:30) CHAR(30),
OBJECT_NAME POSITION(31:60) CHAR(30)
)
还没有做足够的测试, 可能空值这儿有问题.


External table benchmark fixed-length vs. delimited format
http://mujiang.blogspot.com/2009/02/external-table-benchmark-fixed-lenght.html
不知道导出成固定长度的枨式,性能上是不是会差一些。
请问固定长度导出时,是自动根据字段的类型定义来决定长度的吗?
如果字段都是CHAR或VARCHAR2类型的,是否定义中的长度就是输出的长度?
另外,建议可以使用空字符做分隔,即字段之间没有分隔符号。
是的, 根据定义来确定的,如果遇到什到表达式列,则会是4000字节.
我发现sqlplus spool的功能在Oracle10g中比Oracle9i中慢很多。
1G大小的文件,在10g中要30分钟,而在9i中只要10分钟。
你这个工具太快了,只要1分多钟就处理好了。
请问什么时候能改成“使用空字符做分隔,即字段之间没有分隔符号”,如ABC+EFG得到ABCEFG而不是ABC EFG,呵呵
字段之间没有分隔符?那导出来的文本如何再处理呢?如果就是某几个字段的合并,可以在SQL中用Concat搞定。
我们有程序是通过固定长度来判断字段的。
经试验,使用field= ,即等号后什么都不写,可以做到字段间没有分隔符。
另外发现固定长度的一个小问题,假设定义的字段为varchar2(5),但是实际上只存了不到5个字符,则输出时没有10位,如’abc’将输出’abc’而不是’abc ‘。
你好,http://www.anysql.net/software/ociuldr.zip 这个链接对应程序好像是2007年9月20日的版本的,这个版本中还没有实现固定长度的功能吧,最新版本在哪里啊?
源代码好像是新的吧。
重新下载源代码,自已编译一下就行了。
http://www.anysql.net/software/ociuldr.c
能不能做到像oracle spool语句一样,不指定分隔符时,按字段定义的长度来输出,即行的总长度等于各字段长度之和.例如: name varchar(20),不管name为空,或者任意者,都以20字节来输出
能不能做到像oracle spool语句一样,不指定分隔符时,按字段定义的长度来输出,即行的总长度等于各字段长度之和.例如: name varchar(20),不管name为空,或者任意者,都以20字
节来输出
这篇文章写的就是这个功能啊,只是我还没有充分验证.
怎么下载的oci怎么不能实现你这个功能啊? 能不能发给我一份最新的ociuldr程序
晚上我编译一下,然后上传最新的可执行文件吧.
已重新编译了Windows和Linux(x86,Oracle InstantClient 10.2.4)上的可执行文件.
http://www.anysql.net/software/ociuldr.zip
还有一个功能您得再帮实现一下(不会写C代码),生成指定文件的路径如果不存在,那么就无法写入.能不能改造一下,能自动创建输出文件的路径??
要考虑一下这个需求是不是够典型.
我认为这种需求还是很典型,可以加个标记控制一下是否要自动创建路径.批量导出数据可能要按一定规则来分发数据.应该不会都是手工在命令行执行吧?拜托了,或者您单独改一下源程序发到我邮件,呵呵
你的这个功能,不是很容易实现,我会研究研究的.
工具只能支持512个字段吧,我碰上一个表,居然有700多字段。要是能支持任意个数的字段或数据库的限制1000字段就好了。
我想一般不会有这么多字段的表,Oracle最多支持1024个字段,在程序中改一下字段数限制的宏定义就行了.
oracle spool是支持2000个字段导出的.今天试了一下改宏定义的值为2000后抛异常.1000也抛异常,实际导出的表有700多表个字段就抛异常.目前可以确定ociuldr导出700以上的字段是会报错的,700以下也有可能出错,具体多少不清楚,请帮忙看一下程序设计是不是有这样的BUG,太谢谢了.
更正一下,oracle只支持1000个字段导出的.Columns Per table 1000 columns maximum.
我建个表试试再说.
测试过了,是程序中有bug,有一个数组指定了512,没有用宏,改了就好了.
不过列多了,就是慢,笔记本上导出4000多条记录就要一秒钟.
前文书提到Baoqiu Yang, 2008.06.21 发布了一个使用v8 OCI的2.0版本. 您又在1.0版本锦上添花整出个到处固定长度的文本的功能.
作为一个免费用户,我该用哪一个呀?
(虽然没给钱,我个人还是很想付费的,再者,公司可以报销.这么牛的工具,让公司掏出$200~$500, 没有任何问题. 一个Toad,$4000,我们就买了3个.)
希望你们能统一发布,比如开个SourceForge.net: Open Source Software项目,统一版本管理.
多谢,不急, 木匠的一点建议.
附录:
1) 自动创建目录的功能太危险了,建议不要考虑.
2) 既然是输出固定长度列,当然不需要分隔符啦.
External table定义里面,只需要指定每一个列的长度就行了.
你还是先用ociuldr 1吧. 现在用field=0×20来表示导出成固定长度的文本.
lob和long的full support是否很重要? Baoqiu Yang的那个版本中, LOB还有待改进, long则没有全部支持.
公司能掏$200~$500来支持这个,外国企业就是不一样.
对源代码的意见
1.main函数太长,400行
2.if(fixlen==1)写成if(fixlen)
3.大写DEFAULT_ARRAY_SIZE作变量名
固定长度还是慢一些
D:\>ociuldr oo/oo@orcl query=”select * from tcol899″ file=t899.txt
0 rows exported at 2009-03-27 16:08:12
6000 rows exported at 2009-03-27 16:08:15
output file t899.txt closed at 6000 rows.
D:\>ociuldr oo/oo@orcl query=”select * from tcol899″ file=t899f.txt field=0×20
0 rows exported at 2009-03-27 16:08:20
6000 rows exported at 2009-03-27 16:08:24
output file t899f.txt closed at 6000 rows.
不要这么小气地拿6000行做测试, 第二在服务器端测试, 才能达到极限值.
ociuldr的代码是未经优化的, 你用sqluldr测试一下看看, 是不是固定长度格式的性能只取决于IO的速度了.