我正在尝试从Java方法运行SQL Loader,但我遇到了一个问题。
我正在创建一个运行时进程来运行SQLLDR命令,但并不是加载了数据文件中的所有行。相反,无论数据文件中的总行数是多少,它都停留在相同的行数(5184行)。
但是,当我复制完全相同的命令并直接从命令提示符运行它时,它工作得很好,并且所有行都被加载。
你知道这个问题的原因是什么吗?我需要更改Java中的某种缓冲区大小吗?
谢谢!
// Run SQL Loader after creating the control file
Runtime rt = Runtime.getRuntime();
String sqlLoaderPath = "C:\\app\\product\\11.1.0\\client_1\\BIN\\";
String cmd = sqlLoaderPath + "SQLLDR.EXE userid=***************************"
+ "data=c:\\sqlldr\\sqlldr_data.dat "
+ "control=c:\\sqlldr\\sqlldr_control.ctl "
+ "log=c:\\sqlldr\\sqlldr_log.log "
+ "discard=c:\\sqlldr\\sqlldr_discard.disc "
+ "bad=c:\\sqlldr\\sqlldr_bad.bad ";
Process proc = rt.exec(cmd);
int exitVal = proc.waitFor();
proc.destroy();
发布于 2015-10-23 03:38:55
我知道现在回答这个问题太晚了,但写它是因为我遇到了类似的问题。只需在sql-loader控制文件的options子句中添加SILENT=FEEDBACK即可。Sql-loader为输出流提供了有限的缓冲区大小,读取失败将导致子进程通过JAVA挂起,因此只需在其选项中使用SILENT来停止sql-loader的输出流。
发布于 2019-04-03 13:18:12
请看看下面的代码,我们是如何使用的。
String dbStr = "sqlldr "+dbuserid +"/" + dbpassword + "@" + dbServiceName;
String cmdStr = dbStr +" control="+controlFileName;
cmdStr = cmdStr+" log="+logName;
cmdStr = cmdStr+" data="+dataFilePath;
cmdStr = cmdStr+" bad="+badName;
cmdStr = cmdStr+" errors="+Utils.getPropertyString("sqlldr_allowed_error");
Process p = rt.exec( cmdStr );
InputStream in = p.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String line = null;
while( (line = br.readLine()) != null ) {
sb.append(line+"\n");
}
InputStream inE = p.getErrorStream();
InputStreamReader iser = new InputStreamReader(inE);
BufferedReader erbr = new BufferedReader(iser);
while( (line = erbr.readLine()) != null ){
sb.append( "\nError stream:" );
sb.append(line);
}
try {
eValue = p.waitFor();
Utils.info_log.info("waitFor Value is :: "+eValue);
} catch ( Exception e ) {
Utils.info_log.info(Utils.dumpStackTrace(e).toString());
}
https://stackoverflow.com/questions/13600981
复制相似问题