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

为什么我不能通过java在sql文件末尾使用exit来执行大部分.sql文件,java,oracle10g,Java,Oracle10g,我正在尝试从java执行.sql文件。当我将exit放在.sql文件的末尾时,它会成功运行。是否有可能在.sql中运行而不给出exit 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 st

我正在尝试从java执行.sql文件。当我将exit放在.sql文件的末尾时,它会成功运行。是否有可能在.sql中运行而不给出exit

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;
insert into t1 values('aaaaa','chennai')
/
insert into t2 values('bbbbb','ddddd')
/
exit;
@createtable.sql <your params>
@insertvalue.sql <your params>
exit;
insertvalue.sql

createtable.sql
create table t1(empname varchar2(20),address varchar2(20))
/
create table t2(name varchar2(20),lname varchar2(20))
/
exit;
insert into t1 values('aaaaa','chennai')
/
insert into t2 values('bbbbb','ddddd')
/
exit;
@createtable.sql <your params>
@insertvalue.sql <your params>
exit;

如果我最后没有退出,它只会运行第一个文件。有解决方案吗?

在代码中,您在循环中运行命令
sqlplus
,因此必须结束每个命令(使用exit退出sqlplus)。
如果您想在同一个sqlplus实例上调用多个脚本,那么您可以“动态”创建一个脚本,其中包含以下命令:
在eflyscript.sql上

createtable.sql
create table t1(empname varchar2(20),address varchar2(20))
/
create table t2(name varchar2(20),lname varchar2(20))
/
exit;
insert into t1 values('aaaaa','chennai')
/
insert into t2 values('bbbbb','ddddd')
/
exit;
@createtable.sql <your params>
@insertvalue.sql <your params>
exit;
这可能需要进行调试,但我们的想法是,不要使用sqlplus逐个执行所有脚本,而是创建一个包含对所有脚本的调用的新脚本。

现在您可以从所有脚本中删除
exit
sqlplus命令,因为您不需要退出sqlplus(仅在onTheFlyScript.sql中)

退出是为了sqlplus程序,为什么要删除它?为什么你从java运行sqlplus而不使用JDBC呢?谢谢你的回复。如果我使用JDBC,它会逐行执行,或者它需要一些终止符来处理我想使用拆分或分隔符的每个查询。这对我的应用程序来说不好。我想执行大量sql语句。谢谢。实际上我需要执行3.sql文件。第一个用于创建表的文件是它的近24个表。第二个用于向表中插入值的文件是近wan插入375个值。第三个用于存储过程的文件是15个过程。这3个文件保存在D:/script文件夹下(例如)。在我的java pgm中,我只给出了tat文件路径(D:/script)。对于tat,我使用了processbuilder,它按字母顺序运行,所以create.sql然后insert.sql然后procedure.sql。如果我在create.sql的末尾给出exit,那么只有控件才会传输到下一个文件,即insert.sql。否则,它只是单独运行create.sql文件。其他两个文件没有运行。这是我的问题。我想不运行它使用.sql文件末尾的exit.can u reply plzi如果按照建议的方式执行,则不需要在文件中使用
exit
,只需要在调用它们的文件中使用(您在java代码中动态构建的文件),这是因为您不需要退出sqlplus程序。
@
可以替换为sqlplus命令
START
-您可以在同一个sqlplus实例中启动对其他文件的所有调用,我将其添加到应答中。我没有尝试运行代码,但我希望它能帮助您理解我的想法。。。