2010-01-15 6 views

답변

15

이식성있는 방법이 없습니다.

import java.io.*; 
public class CmdExec { 

    public static void main(String argv[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec 
     ("psql -U username -d dbname -h serverhost -f scripfile.sql"); 
     BufferedReader input = 
     new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } 
    catch (Exception err) { 
     err.printStackTrace(); 
    } 
    } 
} 
  • 코드 샘플 here에서 추출하여 사용자가 PostgreSQL의 스크립트 파일을 실행하기를 원하는 가정 질문에 대한 답을 수정 : 당신은 비록 그렇게하기 위해 외부 프로그램으로 네이티브 클라이언트를 실행할 수 있습니다.
2

아니요, 파일을 읽고 별도의 쿼리로 분할 한 다음 개별적으로 (또는 JDBC의 일괄 API를 사용하여) 실행해야합니다.

이유 중 하나는 모든 데이터베이스가 SQL 문을 분리하는 고유 한 방법을 정의한다는 것입니다 (일부는 ;, 다른 하나는 /이고 일부는 사용자 고유의 구분 기호를 정의 할 수 있습니다).

0

JDBC는이 옵션을 지원하지 않습니다 (특정 DB 드라이버가이를 제공 할 수도 있음). 어쨌든 모든 파일 내용을 메모리로로드하는 데는 문제가 없어야합니다.

2

JDBC는 지원하지 않으므로 사용할 수 없습니다. iBATIS를 포함하는 작업은 지속성 프레임 워크이며 Scriptrunner 생성자를 iBatis 문서에 표시된대로 호출하십시오. 간단한 SQL 스크립트를 자바에서 SQL 스크립트를 실행하는 가장 좋은 방법은이 명령 줄

$ mysql -u root -p db_name < test.sql 
+0

iBATIS는이 작업에 대한 좋은 소리 :로 당신은 그것을 실행하는 것입니다! – felipecrp

23

을 사용하여 할 수있는 모든 방법을 실행하기 위해 iBATIS를 같은 무거운 무게 지속성 프레임 워크를 포함

그것 좋지 않다 개미에 의존하지 않는 한 직접 읽지 않아도됩니다. 제 의견으로는 그러한 의존성이 당신의 경우에 매우 정당합니다.

private void executeSql(String sqlFilePath) { 
    final class SqlExecuter extends SQLExec { 
     public SqlExecuter() { 
      Project project = new Project(); 
      project.init(); 
      setProject(project); 
      setTaskType("sql"); 
      setTaskName("sql"); 
     } 
    } 

    SqlExecuter executer = new SqlExecuter(); 
    executer.setSrc(new File(sqlFilePath)); 
    executer.setDriver(args.getDriver()); 
    executer.setPassword(args.getPwd()); 
    executer.setUserid(args.getUser()); 
    executer.setUrl(args.getUrl()); 
    executer.execute(); 
} 
+0

필자는 오라클 SQL 스크립트 몇 개를 시도해 보았습니다.이 스크립트는'insert','create table'에서 작동합니다. 하지만'create or replace trigger '를 가진 스크립트의 경우 ** java.sql.SQLSyntaxErrorException로 실패합니다. ORA-00900 : SQL 문이 잘못되었습니다 ** –

+0

구분 기호를 고려해야합니다 – carpinchosaurio

0

이 코드를보십시오 : 여기 SQLEXEC 클래스는 ant.jar에 살고있는 샘플 코드입니다

String strProc = 
     "DECLARE \n" + 
     " sys_date DATE;"+ 
     "" + 
     "BEGIN\n" + 
     "" + 
     " SELECT SYSDATE INTO sys_date FROM dual;\n" + 
     "" + 
     "END;\n"; 

try{ 
    DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); 
    Connection connection = DriverManager.getConnection ("jdbc:oracle:thin:@your_db_IP:1521:your_db_SID","user","password"); 
    PreparedStatement psProcToexecute = connection.prepareStatement(strProc); 
    psProcToexecute.execute(); 
}catch (Exception e) { 
    System.out.println(e.toString()); 
} 
+8

예제가 지나치게 단순합니다. 'Statement'는 보통 한 번에 하나의 SQL 문만 실행할 수 있습니다. 질문은 많은 수의 쿼리 또는 삽입이 필요하다는 것을 의미하므로 분리 기호를 찾아 개별 구문으로 분리해야합니다. – BoffinbraiN

+0

동의합니다.이 솔루션은 다중 명령문 스크립트에서 작동하지 않습니다. 아래에 제안 된대로 jisql을 사용하십시오. –

1

JDBC이 옵션을 명령을 실행하고이 문제를 해결하는 가장 좋은 방법을 지원하지 않기 때문에 자바 프로그램을 통해 벨로는 PostgreSQL을에 예입니다

private void executeSqlFile() { 
    try { 
     Runtime rt = Runtime.getRuntime(); 
     String executeSqlCommand = "psql -U (user) -h (domain) -f (script_name) (dbName)"; 
     Process pr = rt.exec(); 
     int exitVal = pr.waitFor(); 
     System.out.println("Exited with error code " + exitVal); 
     } catch (Exception e) { 
     System.out.println(e.toString()); 
     } 
} 
2

이동 경로 라이브러리는이 정말 좋다 :

Flyway flyway = new Flyway(); 
    flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword()); 
    flyway.setLocations("classpath:db/scripts"); 
    flyway.clean(); 
    flyway.migrate(); 

이 스크립트의 위치를 ​​검색 한 순서대로 실행됩니다. V01__name.sql을 사용하여 스크립트를 버전화할 수 있으므로 마이그레이션이 호출 된 경우 아직 실행되지 않은 스크립트 만 실행됩니다. 'schema_version'이라는 테이블을 사용하여 사물을 추적합니다. 그러나 다른 것들도 할 수 있습니다, 문서를 참조하십시오 : flyway.

클린 호출은 필요하지 않지만 클린 DB에서 시작하는 것이 좋습니다. 또한 위치를 알고 있어야합니다 (기본값은 "classpath : db/migration"). ':'다음에 공백이 없어서 저를 잡았습니다.

1

이동식으로 가장 단순한 외부 도구는 jisql - https://www.xigole.com/software/jisql/jisql.jsp입니다.

java -classpath lib/jisql.jar:\ 
      lib/jopt-simple-3.2.jar:\ 
      lib/javacsv.jar:\ 
      /home/scott/postgresql/postgresql-8.4-701.jdbc4.jar 
    com.xigole.util.sql.Jisql -user scott -password blah  \ 
    -driver postgresql          \ 
    -cstring jdbc:postgresql://localhost:5432/scott -c \; \ 
    -query "select * from test;" 
+0

'java -classpath lib/jisql-2.0.11.jar을 사용했습니다 : lib/jopt-simple-3.2.jar : lib/javacsv.jar : ../ ojdbc7.jar com.xigole.util.sql.Jisql -user ecm -password TODO -driver oracle.jdbc.OracleDriver -cstring jdbc : oracle : thin : @localhost : 1521 : XE -c \; -input myoracle.sql' 그리고 완벽하게 작동했습니다. –

관련 문제