【发布时间】: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