以前一直以为sqlldr不能装载大于4k大小的文本, 原来这个理解是错误的. 但是在免费的文本导出程序ociuldr中, 没有充分考虑long类型. 第一, 用于fetch的数组大小是固定的500, 第二默认的long类型导出长度是4000. 最主要的原因是ARRAY固定为500不是件好事, 如果我指定long的导出长度为1MB, 那不是得用掉500M的系统内存?
在最新的改进中, ARRAY SIZE的默认值变为50, 最小值为5, 最大值为2000, LONG类型的默认导出长度为32K, 还有就是LONG类型的导出长度乘以ARRAY SIZE的值不能超过100MB, 如果超出, 则ARRAY SIZE的值变为100MB除以LONG导出长度后的值, 如果不足5, 则设为5. 命令行帮助中多了两行:
long = maximum long field size
array = array fetch size
在生成控制时, LONG类型也能自处理, 生成的字段定义如下所示:
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'uldrdata.txt' "STR X'06'"
INTO TABLE t_views
FIELDS TERMINATED BY X'07' TRAILING NULLCOLS
(
OWNER CHAR(30),
VIEW_NAME CHAR(30),
TEXT CHAR(32768)
)
其中TEXT是视图的定义, 我已经在本地试过了, 导入了10K大小的视图定义.
留言 (1)
ociuldr 是我最喜欢的工具了, array = array fetch size 更是令我爱不释手.
稍微泼点冷水, LONG 类型都要被淘汰了, 研究一下各种 CLOB, BLOB 吧, 嘻嘻
Posted by 木匠 | Aug 23, 2007 1:47 AM