簡體   English   中英

從Java調用Oracle“DEFINE”

[英]Calling Oracle “DEFINE” from Java

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

我遇到的問題是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)

我正在使用帶有ojdbc6-11.2.0.1.0.jar JDBC驅動程序的Oracle 11g R2數據庫。 我能夠從sqldeveloper工具和SQLPlus控制台成功執行語句,但不能從Java應用程序執行。 我是否需要在數據庫驅動程序上配置其他屬性? 我可以從這個驅動程序進行這種類型的調用嗎?

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

我也希望能夠使用sql-maven-plugin,但這可能不可能基於這個JIRA:

為替換變量添加Oracle SQLPlus語法

如果有人有任何建議或知道如何讓這個工作,我將不勝感激。

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

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

根據此URL,定義不是SQL語句

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

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

取決於你說你不想進入的原因

  • 您的Java應用程序可以調用操作系統來調用SQL * Plus並傳入腳本
  • 您的Java應用程序可以實現腳本所依賴的任何SQL * Plus功能。 您的應用程序不需要執行DEFINE MYSCHEMA='TESTSCHEMA' ,而是需要維護一個HashMap ,它將像myschema這樣的變量映射到像TESTSCHEMA這樣的值。 然后,您的應用程序必須解析單個SQL語句,查找類似&&MYSCHEMA文本,將其替換為其本地HashMap的值,然后將生成的SQL字符串發送到數據庫服務器。 根據您需要復制的SQL * Plus功能的數量,這可能是一項相當重要的任務。 許多PL / SQL IDE(例如Toad或SQL Developer)實現了SQL * Plus功能的一個子集 - 我不知道有任何嘗試實現每個SQL * Plus功能的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM