我正在尝试从 java 执行 .sql 文件。当我将 exit 放在 .sql 文件的末尾时,它运行成功。是否有可能在不退出 .sql 的情况下运行?
Java代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
private static String script_location = "";
private static String file_extension = ".sql";
private static ProcessBuilder processBuilder =null;
public static void main(String[] args) {
try {
//D:/Tset is the folder that contains the.sql files
File file = new File("D:/Tset");
File [] list_files= file.listFiles(new FileFilter() {
public boolean accept(File f) {
if (f.getName().toLowerCase().endsWith(file_extension))
return true;
return false;
}
});
for (int i = 0; i<list_files.length;i++){
script_location = "@" + list_files[i].getAbsolutePath();
//ORACLE
processBuilder = new ProcessBuilder
("sqlplus","user56/password", script_location); //ORACLE
//script_location = "-i" + list_files[i].getAbsolutePath();
// processBuilder =
new ProcessBuilder("sqlplus",
"-Udeep-Pdumbhead-Spc-de-deep\\sqlexpress-de_com",script_location);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader in =
new BufferedReader(new InputStreamReader(process.getInputStream()));
String currentLine = null;
while ((currentLine = in.readLine()) != null) {
System.out.println(" " + currentLine);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
Oracle 脚本文件:
createtable.sql
createtable.sql
create table t1(empname varchar2(20),address varchar2(20))
/
create table t2(name varchar2(20),lname varchar2(20))
/
exit;
insertvalue.sql
insert into t1 values('aaaaa','chennai')
/
insert into t2 values('bbbbb','ddddd')
/
exit;
如果我最后没有退出,它只会运行第一个文件。有解决办法吗?
最佳答案
在您的代码中,您在循环中运行命令 sqlplus
,因此您必须结束每个命令(使用 exit 退出 sqlplus)。
如果您想在同一个 sqlplus 实例上调用多个脚本,那么也许您可以“即时”创建一个包含以下命令的脚本:
onTheFlyAcript.sql
@createtable.sql <your params>
@insertvalue.sql <your params>
exit;
所以基本上你可以这样做:
try {
Printwriter out = new PrintWriter(new FileWriter("D:/Test/onTheFlyScript.sql"));
for (int i = 0; i<list_files.length;i++){
script_location = "@" + list_files[i].getAbsolutePath();
out.println("START script_location");
}
out.close();
} catch (IOException e){
e.printStackTrace();
}
// note that this command is not in the loop, it's just for running the new script you've created
processBuilder = new ProcessBuilder
("sqlplus","user56/password", "D:/Test/onTheFlyAcript.sql");
这可能需要调试,但我们的想法是,不是用 sqlplus 一个一个地执行所有脚本,而是创建一个包含对所有脚本的调用的新脚本。
现在您可以从所有脚本中删除 exit
sqlplus 命令,因为您不需要退出 sqlplus(仅在 onTheFlyScript.sql 中)
关于java - 为什么我不能通过 java 在 sql 文件末尾使用 exit 来执行大量 .sql 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9426658/