有同事需要将包含LOB列的数据导出成文本文件, 用OCI 7接口写的第一版sqluldr或ociuldr在处理LOB列时(LONG列没有这个问题)遇到了一些不能克服的问题. 在10g的数据库上导出时, 如果LOB列有NULL值或空LOB值, 会出现ORA-32255错误. 对这个错误号, 找遍了Google和Metalink都没有解决方案. 错误信息如下所示.

D:\>sqluldr parfile=testpar.txt

      0 rows exported at 2009-03-27 19:18:19
ORA-32255: Message 32255 not found;  product=RDBMS; facility=ORA
      9 rows exported at 2009-03-27 19:18:19
        output file uldrdata.txt closed at 9 rows.

    如果数据库是9i, 并且没有打过较新的补丁, 则程序会挂起, 这个是已知的Bug.

D:\>sqluldr parfile=testpar.txt

      0 rows exported at 2009-03-27 19:18:19

    按OCI 8接口格式重写的sqluldr2就没有这个问题, 能顺利导出.

D:\>sqluldr2 parfile=testpar.txt

      0 rows exported at 2009-03-27 19:18:13
      9 rows exported at 2009-03-27 19:18:13
        output file uldrdata.txt closed at 9 rows.

    重写后的版本性能上好象比第一版略有提高, 导出成逗号分隔的文件用的时间为:

D:\>sqluldr2 parfile=testpar.txt array=500

      0 rows exported at 2009-03-27 19:19:12
  500000 rows exported at 2009-03-27 19:19:15
1000000 rows exported at 2009-03-27 19:19:18
1500000 rows exported at 2009-03-27 19:19:22
2000000 rows exported at 2009-03-27 19:19:25
2500000 rows exported at 2009-03-27 19:19:29
3000000 rows exported at 2009-03-27 19:19:32
3500000 rows exported at 2009-03-27 19:19:35
3670044 rows exported at 2009-03-27 19:19:37
        output file uldrdata.txt closed at 3670044 rows.

    导出成固定长度格式的文件用的时间为:

D:\>sqluldr2 parfile=testpar.txt array=500 field=0×20

      0 rows exported at 2009-03-27 19:19:45
  500000 rows exported at 2009-03-27 19:19:48
1000000 rows exported at 2009-03-27 19:19:51
1500000 rows exported at 2009-03-27 19:19:55
2000000 rows exported at 2009-03-27 19:19:59
2500000 rows exported at 2009-03-27 19:20:03
3000000 rows exported at 2009-03-27 19:20:06
3500000 rows exported at 2009-03-27 19:20:10
3670044 rows exported at 2009-03-27 19:20:11
        output file uldrdata.txt closed at 3670044 rows.

    实际上花了两个小时重写, 比我以前预计的要简单一些, 可下载两个版本的程序进行测试.