一般碰到这种问题,都是手工执行命令导入是成功,但用程序调用就不成功了。
我也碰到了同样的问题,而且是在一台机器上程序调用sqlldr好用,在另一机器却不好用了。
仔细分析了一下问题,后来发现手工执行和程序调用的一个区别:
(1)手工执行:一般人都会在CMD下进入到CTL所在的目录,然后调用SQLLDR命令。执行成功。注意此时的当前路径已经在CTL所在的目录了。
(2)程序调用:程序调用时则是用同样的SQLLDR命令去执行,结果发现不报错,但数据却没有导入。注意此时的当前路径是在程序所在的目录下。
原因分析:
基于以上分析可看出大部分人执行不成功的原因是CTL中的INFILE路径不对(一般人都用相对路径,如XXX.txt),因为如果程序执行,会在程序的所在目录找数据文件,却找不到,所以失败了。这种情况是不会出错而且不会生成LOG(因为没执行)。
另外一个问题:我使用的是绝对路径,在一台机器A上好用,在另外一机器B导入数据不成功,这是怎么回事,想了好半天,发现一个现象:
在机器B上的程序是放在桌面上,生成的数据文件是放在桌面上的。
原因分析:
桌面的路径是:C:/Documents and Settings/XXX/桌面 问题就出在这,路径中有空格就出事了。改到没空格的路径一切正常。
结论:
INFILE路径设置建议:
(1)最好使用绝对路径,建议由程序动态生成CTL文件
(2)不要带有空格,到于对有空格的路径加上“”,是不是会好用,暂未试验。但加' '是不好用的,这个已经试过。