近期开发了个功能,数据库是用的是oracle 19,需要用到sqlLoader导入数据,开发过程中遇到的问题,记录一下:
ctl文件写好,.dat文件准备好等;
第一:
java.io.IOException: Cannot run program "@conn“: error=2,没有那个文件或目录
指向@conn–数据库连接串,认定@conn为一个文件或目录,也是头一回碰到,排查过@conn(username/password@database)的书写是否规范问题,确认无误后;
再去排查服务器:
a.环境变量ORACLE_HOME是否为空;
b.环境变量PATH中是否配置了sqlldr的路径;
c.oracle安装目录bin下是否有sqlldr的可执行文件;
以上abc均正常;
第二:
代码中关于data,log,bad等文件的路径正常,本地debug到这行代码直接抛异常,
Process p = Runtime.getRuntime().exec(cmd);
处理方法:
a.在java代码中cmd命令前加“cmd ” --> cmd @conn control=.ctl log= .log bad=.bad;
b.在java代码中cmd命令前加“cmd /C ” --> cmd /C @conn control=.ctl log= .log bad=.bad;
c.在java代码中cmd命令前加“sqlldr " --> sqlldr @conn control=*.ctl log= .log bad=.bad”;
a和b出现提示: -bash cmd 或则 -bash cmd /C not found;
c的情况出现提示
java.io.IOException: Cannot run program “sqlldr“: error=2,没有那个文件或目录
这里的abc三步,均在本地服务器上调试的
第三:
本着不信邪的想法,直接在服务器上执行分别执行上述abc三步的命令,
a和b出现提示: -bash cmd 或则 -bash cmd /C not found;
不一样的是c,
c 命令正常执行,sqlldr @conn control=*.ctl log= .log bad=.bad
心想,我真该si啊,太相信本地的开发环境了,
但是 0 Rows successfully loaded. 再去看.log文件,原来是number类型引发的ORA-01722问题;
后续在代码中:
Process p = Runtime.getRuntime().exec(“sqlldr ”+cmd);
放服务器上运行,正常导入数据。