2012-07-09 55 views
2

我需要在Oracle中定義一些變量,以便在我們的應用程序的數據庫安裝腳本中進一步使用。基本上,我們的安裝程序現在的工作方式是讀取腳本文件並通過Java中的JDBC調用每個腳本文件。我需要讓Oracle在數據庫端進行變量替換,因爲需要引用它們的過程,觸發器,創建語句等(就像「CREATE TABLE & & MYSCHEMA.TBL_NAME ...」一樣)。從Java調用Oracle「DEFINE」

我遇到的問題是,define語句從Java(例如)調用時,它拋出一個錯誤:

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應用程序執行語句。我是否需要在數據庫驅動程序上配置其他屬性?我可以通過此驅動程序進行此類通話嗎?

我知道有些人可能會建議在Java端使用變量綁定,但這不是一種選擇。腳本需要從SQL接口和安裝程序都可執行。除此之外還有其他一些原因,我不會介紹。

我也希望能得到這與SQL-Maven的插件工作,但在此基礎上JIRA那是不可能的:

Add Oracle SQLPlus syntax for substitution variables

如果任何人有任何意見或不知道如何得到這個工作,我將不勝感激。

回答

4

兩個DEFINE和替代變量語法&&MYSCHEMA.TBL_NAME是SQL * Plus命令。它們不是有效的SQL或PL/SQL結構。您將無法通過JDBC按原樣使用它們。

根據你說你不想進入

  • 你的Java應用程序可以調用出操作系統調用SQL * Plus並通過腳本
  • 你的Java原因應用程序可以實現腳本所依賴的任何SQL * Plus功能。您的應用程序不需要執行DEFINE MYSCHEMA='TESTSCHEMA',而是需要維護一個HashMap,它將像myschema這樣的變量映射到TESTSCHEMA這樣的值。然後,您的應用程序必須解析查找&&MYSCHEMA等文本的單個SQL語句,並將其替換爲本地HashMap中的值,然後將生成的SQL字符串發送到數據庫服務器。取決於您需要複製多少SQL * Plus功能,這可能是一個相當重要的任務。許多PL/SQL IDE(如Toad或SQL Developer)實現了SQL * Plus功能的一個子集 - 我不知道任何試圖實現每個SQL * Plus功能的東西。
6

我不認爲DEFINE會在SQLPLUS之外工作 - JAVA使用JDBC 並且假定execute()參數是有效的SQL。如果您可以使用在SQLPLUS外部使用DEFINE,則意味着您使用的實用程序是 ,旨在兼容或部分替換SQLPLUS。

DEFINE是一個SQLPLUS命令--SQLPLUS是一個ORACLE實用程序。

根據這個URL定義不是一個SQL語句

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

+0

謝謝。我有這種感覺,但我不確定。 – Steve 2012-07-09 20:55:29