【问题标题】:How to execute SQL file from CMD prompt using Java ProcessBuilder如何使用 Java ProcessBuilder 从 CMD 提示符执行 SQL 文件
【发布时间】:2015-01-19 08:50:27
【问题描述】:

我编写了一个java程序,使用ProcessBuilder来启动CMD提示并连接SQLPLUS来执行一些SQL文件。

public class OracleConnect {

    public static void main(String[] args) throws IOException {
        String[] cmd = new String[] { "sqlplus", "<USER>/<PASSWORD>@<INSTANCE>" };
        ProcessBuilder builder = new ProcessBuilder(cmd);
        Process process = builder.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        new ReadFromConsole(br).start();
        new WriteToConsole(bw).start();
    }
}

class AbsThread extends Thread {
    boolean read = true;
    boolean write = false;
}

class ReadFromConsole extends AbsThread {

    BufferedReader processOut;

    public ReadFromConsole(BufferedReader processOut) {
        this.processOut = processOut;
    }

    @Override
    public void run() {
        while (read) {
            int i = -1;
            try {
                while ((i = processOut.read()) != -1) {
                    char ch = (char) i;
                    System.out.print(ch);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            write = true;
            read = false;
        }
    }

}

class WriteToConsole extends AbsThread {

    BufferedWriter processIn;

    public WriteToConsole(BufferedWriter processIn) {
        this.processIn = processIn;
    }

    @Override
    public void run() {
        while (write) {
            System.out.print("Enter command ");
            String cmd = new Scanner(System.in).nextLine();
            try {
                processIn.write(cmd);
                processIn.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            read = true;
            write = false;
        }
    }
}

控制台输出:

SQL*Plus:2015 年 1 月 19 日星期一 14:07:53 发布 11.2.0.3.0 生产版

版权所有 (c) 1982、2011、甲骨文。保留所有权利。

连接到:Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 具有分区、Oracle 标签安全、OLAP、数据挖掘和真正应用测试选项的 64 位生产

SQL>

程序在读取 BLINK_CHARACTER 时挂起,我尝试了 read() 和 readLine() 都没有读取 BLINK_CHARACTER。

如果我手动操作,在 CMD 提示符中得到以下响应

C:>sqlplus USER/PASSWORD@INSTANCE

SQL*Plus:2015 年 1 月 19 日星期一 12:29:44 发布 11.2.0.3.0 生产版

版权所有 (c) 1982、2011、甲骨文。保留所有权利。

连接到:Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 具有分区、Oracle 标签安全、OLAP、数据挖掘和真正应用测试选项的 64 位生产

SQL> _[BLINK_CHARACTER]

如何通过在运行时提供用户名和密码使其具有交互性?而且我还需要为 Informatica 进程实现相同类型的交互式 CMD 提示。

PS:在 SQLPLUS 中,可以通过单个命令本身登录和执行 SQL 文件,但我想让它具有交互性

【问题讨论】:

    标签: java oracle cmd processbuilder


    【解决方案1】:

    如果从连接字符串中删除用户名/密码和@ 字符,SQL*Plus 将提示输入用户名/密码:

    sqlplus <INSTANCE>
    

    SQL*Plus:版本 11.2.0.0.0 - 2015 年 1 月 19 日星期一 14:07:53 生产
    (c) 版权所有 1982、2008 甲骨文公司。保留所有权利。
    输入用户名:

    【讨论】:

    • @Saravana 出于安全原因,许多工具不会从标准输入读取密码,而是从附加的 tty 读取密码。我不知道这是否是 SQL*Plus 的情况,但它看起来像......
    • 我不希望它从CMD读取密码,我可以通过执行sqlplus USER/PASSWORD@INSTANCE在一行中登录SQLPLUS,登录后我会得到SQL &gt; 提示,这里我想要执行一些 SQL 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2017-09-18
    相关资源
    最近更新 更多