java - 为什么我不能通过 java 在 sql 文件末尾使用 exit 来执行大量 .sql 文件

标签 java oracle10g

我正在尝试从 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&lt;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/

相关文章:

sql - 从 oracle sql 查询的输出中删除重复值

java - 在 Java 中适用时使用 "final"修饰符

java - 为什么这些重新抛出的异常中的任何一个都会产生编译器错误?

java - 如何写入没有属性名称的 JSON 值

sql - (Oracle) 使用分页查询时如何获取结果总数?

oracle10g - 在 Oracle 中,使用序列作为代理主键被视为标准

java - — 特殊字符解码

java - 我可以关闭并重新打开套接字吗?

oracle - 在匿名 block 内显示选择结果

sql - 如何确定存储过程最后一次在 Oracle 中修改或编译的时间?