我们的一个项目采用SQL*Loader的方法将数据导入Oracle数据库。
主要方法是Java写好控制文件拼接好sqlldr命令字符串,通过Runtime类在终端命令行执行。
但是在执行的时候报错了,java.io.IOException: Cannot run program "sqlldr": error=2, A file or directory in the path name does not exist。
但是我用相同的命令在cmd里面可以执行,这是什么原因呢
贴下你写的执行的sqlldr的代码
,这个是我执行的命令,我在java里面调用的命令是一样的
public static String getLoaderCmdStr(String userid, String ctlFile, String csvData, String impLog, String badFile, boolean isClobData){
FileUtil.mkdirsPath(FileUtil.getPathOfPathFile(impLog));
FileUtil.mkdirsPath(FileUtil.getPathOfPathFile(badFile));
StringBuilder builder = new StringBuilder();
String osName = System.getProperty("os.name").toLowerCase();
if(osName.trim().startsWith("win")){
builder.append("cmd /c set NLS_LANG=AMERICAN_AMERICA.AL32UTF8 && ");
}
builder.append("sqlldr skip=1 rows=100000 readsize=20680000 bindsize=20680000 errors=-1 ")
.append("userid=").append(userid)
.append(" control=").append(ctlFile)
.append(" data=").append(csvData)
.append(" log=").append(impLog)
.append(" BAD=").append(badFile);
if(!isClobData){
builder.append(" direct=true")
;
}
log.debug("imp command:" + builder.toString());
return builder.toString();
}
你就只看拼的执行命令的字符串部分就可以了。执行的话,应该都是一样的方式。