4

我正在尝试从 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();
4

2 回答 2

1

我知道现在回答这个问题为时已晚,但写下来是因为我遇到了类似的问题。只需在 sql-loader 控制文件的选项子句中添加 SILENT=FEEDBACK 即可。Sql-loader 为输出流提供有限的缓冲区大小,读取失败会导致子进程通过 JAVA 挂起,因此只需在其选项中使用 SILENT 来停止 sql-loader 的输出流。

于 2015-10-22T19:38:54.510 回答
0

请查看下面的代码,我们如何使用。

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());
        }
于 2019-04-03T05:18:12.130 回答