Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过在java中使用Runtime.exec()运行sqlplus从sqlplus窗口捕获输出_Java_Sqlplus - Fatal编程技术网

如何通过在java中使用Runtime.exec()运行sqlplus从sqlplus窗口捕获输出

如何通过在java中使用Runtime.exec()运行sqlplus从sqlplus窗口捕获输出,java,sqlplus,Java,Sqlplus,我试图从java运行一个sql脚本(这里是memo222Dataferg.out),并试图从sqlplus窗口捕获输出。这是我的密码 Runtime rt = Runtime.getRuntime(); String runString1 = "cmd /c start sqlplus pecok/pecok@xe @C:\workspace\PeCok_Tool\memo_222dataFERG.out";

我试图从java运行一个sql脚本(这里是memo222Dataferg.out),并试图从sqlplus窗口捕获输出。这是我的密码

Runtime rt = Runtime.getRuntime();
                                String runString1 = "cmd /c start sqlplus pecok/pecok@xe @C:\workspace\PeCok_Tool\memo_222dataFERG.out";  
                                Process proc = null; 
                                proc = rt.exec(runString1);
                            //  proc = rt.exec("java -version");
                                InputStream is = proc.getErrorStream();
                                //InputStream is = proc.getInputStream();
                                int bufSize = 4096; 
                                BufferedReader in = new BufferedReader(new InputStreamReader(is), bufSize);
                                String currentLine = null; 
                                while ((currentLine = in.readLine()) != null) {
                                    System.out.println(" "  + currentLine); 
                                }
                                is.close();
                                int a = proc.waitFor();
                                System.out.println(" proc.waitFor() :: " +a);

Sqlplus执行。SQLPlus窗口打开,它开始执行我在C:\workspace\PeCok\u Tool\memo\u 222dataFERG.out文件中编写的插入语句。但我无法从sqlplus窗口捕获输出并在eclipse控制台中打印它。在while循环中,它挂起并且不在eclipse控制台中打印任何内容。但当我运行“java-version”(代码中有注释)时,它成功地将java版本打印为控制台中的输出。现在我的问题是如何读取sqlplus窗口的输出?我尝试了getErrorStream()和getInputStream()。

我知道您特别询问sqlplus和进程分叉,但是SQLcl运行sqlplus所做的任何事情,并且完全用java编写,因此易于集成

我这里有一个github回购协议,目标是如何做到这一点:

下面是一个java示例:

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.dbtools.raptor.newscriptrunner.ScriptExecutor;
import oracle.dbtools.raptor.newscriptrunner.ScriptRunnerContext;

public class RunMyScript {

  public static void main(String[] args) throws SQLException, UnsupportedEncodingException {
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE", "klrice", "klrice");
    conn.setAutoCommit(false);

    // #create sqlcl
    ScriptExecutor sqlcl = new ScriptExecutor(conn);

    // #setup the context
    ScriptRunnerContext ctx = new ScriptRunnerContext();

    // #set the context
    sqlcl.setScriptRunnerContext(ctx);
    ctx.setBaseConnection(conn);

    // Capture the results without this it goes to STDOUT
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    BufferedOutputStream buf = new BufferedOutputStream(bout);
    sqlcl.setOut(buf);


    // # run a whole file 
    // adjust the path as it needs to be absolute
    sqlcl.setStmt("@/Users/klrice/workspace_commons/sqlcl-java/myfile.sql");
    sqlcl.run();


    String results = bout.toString("UTF8");
    results = results.replaceAll(" force_print\n", "");
    System.out.println(results);
  }

}

我知道您特别询问了sqlplus和进程分叉,但是SQLcl运行sqlplus所做的任何事情,并且完全用java编写,因此易于集成

我这里有一个github回购协议,目标是如何做到这一点:

下面是一个java示例:

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.dbtools.raptor.newscriptrunner.ScriptExecutor;
import oracle.dbtools.raptor.newscriptrunner.ScriptRunnerContext;

public class RunMyScript {

  public static void main(String[] args) throws SQLException, UnsupportedEncodingException {
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE", "klrice", "klrice");
    conn.setAutoCommit(false);

    // #create sqlcl
    ScriptExecutor sqlcl = new ScriptExecutor(conn);

    // #setup the context
    ScriptRunnerContext ctx = new ScriptRunnerContext();

    // #set the context
    sqlcl.setScriptRunnerContext(ctx);
    ctx.setBaseConnection(conn);

    // Capture the results without this it goes to STDOUT
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    BufferedOutputStream buf = new BufferedOutputStream(bout);
    sqlcl.setOut(buf);


    // # run a whole file 
    // adjust the path as it needs to be absolute
    sqlcl.setStmt("@/Users/klrice/workspace_commons/sqlcl-java/myfile.sql");
    sqlcl.run();


    String results = bout.toString("UTF8");
    results = results.replaceAll(" force_print\n", "");
    System.out.println(results);
  }

}

如果直接从命令提示符运行命令,会发生什么情况?您的脚本是否以“退出”结尾?否。。。脚本中没有出口。好吧,这是你的问题;如果不退出,SQL*Plus将坐在那里等待更多输入。谢谢你,亚历克斯。我在脚本中加入了exit。现在工作正常。如果直接从命令提示符运行命令,可能会发生重复的情况?您的脚本是否以“退出”结尾?否。。。脚本中没有出口。好吧,这是你的问题;如果不退出,SQL*Plus将坐在那里等待更多输入。谢谢你,亚历克斯。我在脚本中加入了exit。现在它工作正常。可能是