java - 从 java 运行 Oracle sql 脚本会出现 SQLSyntaxErrorException : ORA-00900: invalid SQL statement

标签 java sql oracle ant plsql

我正在使用Oracle 11g,我正在通过java代码执行Oracle sql脚本。我的 SQL 脚本可能包含 SQL 语句(DDL 或 DML)或 PL/SQL block ,因此我不想在我的 java 代码中解析该脚本,而是使用 This solution立即执行完整的脚本。以下是示例代码,其中SQLExec类位于 ant jar 中。

此解决方案适用于大多数情况,但如果 sql 脚本包含创建或替换触发器,则会失败并显示java.sql.SQLSyntaxErrorException:ORA-00900:无效的 SQL 语句。我还指定了失败的 sql 脚本片段。

请注意,如果我通过 SQL Developer 运行相同的脚本,它运行良好。

以下是Java代码:

private void executeSql(String sqlFilePath) {
    final class SqlExecuter extends SQLExec {
        public SqlExecuter() {
            Project project = new Project();
            project.init();
            setProject(project);
            setTaskType("sql");
            setTaskName("sql");
        }
    }

    SqlExecuter executer = new SqlExecuter();
    executer.setSrc(new File(sqlFilePath));
    executer.setDriver(args.getDriver());
    executer.setPassword(args.getPwd());
    executer.setUserid(args.getUser());
    executer.setUrl(args.getUrl());
    executer.execute();
}

SQL 脚本片段:

......
......
CREATE OR REPLACE TRIGGER MY_TRG
   BEFORE INSERT ON MY_TABLE
   FOR EACH ROW
   BEGIN
    :NEW.MYNUMBER := MY_SEQUENCENUM.NEXTVAL;
   END;

以下是异常跟踪:

Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement

    at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:398)
    at com.kuldeep.OracleConnectionTest.executeSql(OracleConnectionTest.java:160)
    at com.kuldeep.OracleConnectionTest.main(OracleConnectionTest.java:25)
Caused by: 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)
    at org.apache.tools.ant.taskdefs.SQLExec.execSQL(SQLExec.java:499)
    at org.apache.tools.ant.taskdefs.SQLExec.runStatements(SQLExec.java:470)
    at org.apache.tools.ant.taskdefs.SQLExec$Transaction.runTransaction(SQLExec.java:664)
    at org.apache.tools.ant.taskdefs.SQLExec$Transaction.access$000(SQLExec.java:627)
    at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:370)

最佳答案

documentation它说:

可以提供多个语句,用分号(或定义的分隔符)分隔。

因此,使用分号字符 (;) 作为默认分隔符,SQLEXEC 将脚本的 CREATE TRIGGER 语句解释为两个语句,并给出此错误消息结果。

关于java - 从 java 运行 Oracle sql 脚本会出现 SQLSyntaxErrorException : ORA-00900: invalid SQL statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20705807/

相关文章:

java.sql.SQLException:参数 IN 或 OUT 缺失,位于 l'index::3

database - 与 MS SQL Server Management Studio 免费版对应的 Oracle 是什么?

java - 映射结构 : Ambiguous mapping methods found for mapping collection element

Java 8 流 : process every possible pair of elements from list

java - 如何使用 Java Streams 从 HashMap 的 ArrayList 中获取字符串

sql - 帮助用sql比较两个列表

java - 保证将请求发送到 Web 服务

java - mysql数据库无法连续插入大量数据集的原因是什么?

sql - 在 Sql 存储过程中使用 XML PATH

java - oracle中使用java的性能开销