一网友导出了7亿多条记录之后, 生成了一个50g大小的文本文件, 却发现Perl处理起来比较难, 于是问我是不是可能导出成几个文件. 现在对程序作了改进, 增加了一个命令行选项:batch. 指定在几个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.
请大家重新下载, 或下载源代码来编译. 以前的Linux版本在编译时没有加上64Bit IO的支持, 可能不能导出大于4GB的数据.
留言 (8)
顶一下,好用的!
Posted by blue_prince | Nov 23, 2006 10:23 PM
下载了最新的程序,
linux 和win版是table选项时都会报错,
linux下报segfault
win下报程序异常
Posted by adam | Dec 7, 2006 2:27 PM
请重新下载, 现在应当好了.
Posted by anysql | Dec 7, 2006 3:12 PM
呵呵,刚才自己debug了一下,关错文件了:)
if (fpctl != NULL) fclose(fp);
->
if (fpctl != NULL) fclose(fpctl);
Posted by adam | Dec 7, 2006 4:50 PM
是的, 上传程序前没有作足够的测试.
Posted by anysql | Dec 7, 2006 5:23 PM
您好:
./oci32 user=test/test query='select * from test' mode=append batch=2 array=1000 file=test%d.dat
源碼compile,使用batch功能,但檔名卻出現test10.dat,10 -> 7月10日
但使用貴站所compile的bin file,卻會出現正確檔名,既test01.dat,test02.dat
可否請問使用源碼需要修改呢??
solaris 10 ,gcc 3.4.6
Posted by jarry wei | Jul 10, 2008 2:02 AM
%y表示年, %m表示月, %d表示天,%b表示批号
这是最近一次的修改,没有在网上写明修改。Solaris的是老的程序编译的。
楼上的为什么要将ociuldr的命字改掉?
Posted by anysql | Jul 10, 2008 9:03 AM
改名為oci32,只是想測試32bit and 64bit compile後的差異,謝謝您
Posted by jarry wei | Jul 10, 2008 10:40 AM