一个用sqlldr来装载数据的批处理角本发生了如上错误.
% 9205/bin/sqlldr *****/*****@***** control=testsqlldr.ctl data=.....
SQL*Loader: Release 9.2.0.5.0 - Production on Tue Aug 7 18:00:35 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL*Loader-704: Internal error: ulconnect: OCIInitialize [1804]
一开始我以为1804就是ORA-01804, 于是就用oerr查错误信息.
01804, 00000, "failure to initialize timezone information"
// *Cause: The timezone information file was not properly read.
// *Action: Please contact Oracle Customer Support.
但经过检查没有什么Timestamp类型的列啊? 而且单独运行是可以的. 几经周折, 最后发现在程序中指定了使用9205的sqlldr, 而Shell登录进去时设的环境变量还是8174的. 检查一下环境变量设置.
% env | grep ORACLE_HOME
ORACLE_HOME=/export/home/oracle/products/8174x64
为什么他们要作这个变动呢? 因为他们想用Direct Load, 其实Direct Load要求sqlldr的版本和数据库的版本一致, 因此9203的客户端也是不行的, 还是改回8174的吧, 通过加大BINDSIZE和READSIZE来优化sqlldr的速度算了.