gpt4 book ai didi

java - 从 Java 调用 Oracle "DEFINE"

转载 作者:行者123 更新时间:2023-12-03 01:51:59 24 4
gpt4 key购买 nike

我需要在 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 端使用变量绑定(bind),但这不是一个选择。这些脚本需要可以从 SQL 界面和安装程序执行。除了这个之外还有其他的原因,我就不多说了。

我也希望让它与 sql-maven-plugin 一起工作,但是基于这个 JIRA 这可能是不可能的:

Add Oracle SQLPlus syntax for substitution variables

如果有人有任何建议或知道如何让它发挥作用,我将不胜感激。

最佳答案

我认为 DEFINE 不会在 SQLPLUS 之外工作 - JAVA 使用 JDBC并假设execute() 的参数是有效的SQL。如果你能够在 SQLPLUS 之外使用 DEFINE 这意味着您正在使用的实用程序是旨在与 SQLPLUS 兼容或部分替代 SQLPLUS。

DEFINE 是一个 SQLPLUS 命令 - SQLPLUS 是一个 ORACLE 实用程序。

根据这个URL Define不是一条SQL语句

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

关于java - 从 Java 调用 Oracle "DEFINE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11402729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com