繁体   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