Почему я не могу выполнить большую часть файла .sql без использования выхода в конце файла sql через Java - PullRequest
4 голосов
/ 24 февраля 2012

Я пытаюсь выполнить файл .sql из Java.Он работает успешно, когда я ставлю выход в конце файла .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;

Если я наконец не поставлю выход, он просто запустит только первый файл.Есть ли решение для этого?

1 Ответ

0 голосов
/ 24 февраля 2012

В вашем коде вы запускаете команду sqlplus в цикле, поэтому вы должны завершить каждую команду (используя выход для выхода из 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...