2012-07-09 2 views
2

Oracle의 일부 변수를 정의하여 응용 프로그램의 데이터베이스 설치 스크립트를 사용하도록 지정해야합니다. 기본적으로 설치 프로그램의 작동 방식은 스크립트 파일을 읽고 Java에서 JDBC를 통해 각 파일을 호출하는 것입니다. 나는 오라클이 데이터베이스 측에서 변수 치환을 할 필요가있다. 프로 시저, 트리거, 구문을 참조 할 필요가있다. ("CREATE TABLE & & MYSCHEMA.TBL_NAME ..."처럼).Java에서 Oracle "DEFINE"호출

private static void testDefineVariables() { 
    String url = "jdbc:oracle:thin:@localhost:1521:LOCALDEV"; 
    String username = "SYSTEM"; 
    String password = "manager42"; 
    Connection conn = null; 
    Statement stmt = null; 
    try { 
     conn = DriverManager.getConnection(url, username, password); 
     stmt = conn.createStatement(); 

     //Execute the sql 
     stmt.execute("DEFINE MYSCHEMA='TESTSCHEMA'"); 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally { 
     try { 

     if(stmt != null) 
      stmt.close(); 

     if(conn != null) 
      conn.close(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

오류는 다음과 같습니다 :

java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement 

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395) 
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802) 
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) 
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521) 
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194) 
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307) 
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1882) 
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1847) 
at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:301) 

내가 오라클을 사용하고

오전 데 문제는 자바 (예)에서 호출 할 때 오류를 던지고 문을 정의하는 것입니다 11g R2 데이터베이스와 ojdbc6-11.2.0.1.0.jar JDBC 드라이버. sqldeveloper 도구와 SQLPlus 콘솔에서 성공적으로 문을 실행할 수 있지만 Java 응용 프로그램에서는 실행할 수 없습니다. 데이터베이스 드라이버에 추가 속성을 구성해야합니까? 이 드라이버에서이 유형의 전화를 걸 수 있습니까?

박쥐가 자바 측에서 변수 바인딩을 사용하는 것이 좋습니다. 그러나 이것은 옵션이 아닙니다. 스크립트는 SQL 인터페이스와 설치 프로그램 모두에서 실행 가능해야합니다. 이것과 별개로 다른 이유가 있습니다.

나는이는 SQL-받는다는 - 플러그인과 함께 작동하도록 바라고 있지만,이 JIRA에 따라 가능하지 않을 수 있습니다

Add Oracle SQLPlus syntax for substitution variables

사람이 어떤 제안이있는 경우 또는 방법을 알고 이 기능을 작동 시키려면 크게 감사하겠습니다.

답변

4

모두 DEFINE&&MYSCHEMA.TBL_NAME의 SQL * Plus를 명령입니다 대체 변수 구문이 아니다. 유효한 SQL 또는 PL/SQL 구문이 아닙니다. JDBC를 통해 그대로 사용할 수 없습니다.

당신은 SQL * Plus를 호출하고 스크립트

  • 자바를 전달하기 위해 운영 체제를 호출 할 수

    • 귀하의 Java 응용 프로그램에 가고 싶지 않아 말할 이유에 따라 응용 프로그램은 스크립트가 의존하는 모든 SQL * Plus 기능을 구현할 수 있습니다. DEFINE MYSCHEMA='TESTSCHEMA'을 실행하는 대신 응용 프로그램에서 myschema과 같은 변수를 TESTSCHEMA과 같은 값으로 매핑하는 HashMap을 유지 관리해야합니다.그런 다음 응용 프로그램은 &&MYSCHEMA과 같은 텍스트를 찾는 개별 SQL 문을 구문 분석하고 로컬 HashMap의 값으로 대체 한 다음 결과 SQL 문자열을 데이터베이스 서버로 보냅니다. 얼마나 많은 SQL * Plus 기능을 복제해야하는지에 따라 상당히 합리적 일 수 있습니다. Toad 또는 SQL Developer와 같은 많은 PL/SQL IDE는 SQL * Plus 기능의 하위 집합을 구현합니다. 마지막 SQL * Plus 기능을 구현하려고 시도한 모든 것을 모릅니다.
  • 6

    DEFINE이 SQLPLUS 외부에서 작동하지 않는다고 생각합니다. Java는 JDBC 을 사용하며 execute()의 인수는 유효한 SQL이라고 가정합니다. 만약 DEFINE SQLPLUS 밖에서 사용할 수 있다면, 사용하고있는 유틸리티가 이고 SQLPLUS와 부분적으로 호환되도록 의도되었다는 것을 의미합니다.

    DEFINE은 SQLPLUS 명령입니다. SQLPLUS는 오라클 유틸리티입니다. 정의이 URL에 따르면

    는 SQL 문

    http://www.adp-gmbh.ch/ora/sqlplus/define.html

    +0

    감사합니다. 나는 이것이 사실이라고 느끼는 것을 가졌지 만 나는 확실하지 않았다. – Steve

    관련 문제