从Java运行Oracle SQL脚本给SQLSyntaxErrorException:ORA-00900:无效的SQL语句 [英] Running Oracle sql script from java gives SQLSyntaxErrorException: ORA-00900: invalid SQL statement

查看:5023
本文介绍了从Java运行Oracle SQL脚本给SQLSyntaxErrorException:ORA-00900:无效的SQL语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Oracle 11g中,我通过Java code执行的Oracle SQL脚本。我的SQL脚本可以包含SQL语句(DDL或DML)或PL / SQL块,所以我不想解析脚本在我的Java code,但使用的这个解决方案在执行一次完整的脚本。以下是示例code,其中<一个href=\"http://www.jajakarta.org/ant/ant-1.6.1/docs/en/manual/api/org/apache/tools/ant/taskdefs/SQLExec.html\"相对=nofollow> SQLEXEC 类是在蚂蚁的jar

该解决方案为大多数情况下只是如果SQL脚本包含创建或更换触发器失败是 java.sql.SQLSyntaxErrorException:ORA-00900:无效的SQL声明。我还指定SQL脚本失败的片断。

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

以下是Java的code:

 私人无效的ExecuteSQL(字符串sqlFilePath){
    最后一类SqlExecuter扩展SQLEXEC {
        公共SqlExecuter(){
            项目项目=新的项目();
            project.init();
            setProject(项目);
            setTaskType(SQL);
            setTaskName(SQL);
        }
    }    SqlExecuter执行器=新SqlExecuter();
    executer.setSrc(新文件(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
   开始
    :NEW.MYNUMBER:= MY_SEQUENCENUM.NEXTVAL;
   结束;

以下是异常跟踪:

 异常线程mainjava.sql.SQLSyntaxErrorException:ORA-00900:无效的SQL语句    在org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:398)
    在com.kuldeep.OracleConnectionTest.executeSql(OracleConnectionTest.java:160)
    在com.kuldeep.OracleConnectionTest.main(OracleConnectionTest.java:25)
java.sql.SQLSyntaxErrorException:ORA-00900:无效的SQL语句引起    在oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
    在oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
    在oracle.jdbc.driver.T4C8Oall.pr​​ocessError(T4C8Oall.java:802)
    在oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
    在oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
    在oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
    在oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
    在oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000)
    在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
    在oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1882)
    在oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1847)
    在oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:301)
    在org.apache.tools.ant.taskdefs.SQLExec.execSQL(SQLExec.java:499)
    在org.apache.tools.ant.taskdefs.SQLExec.runStatements(SQLExec.java:470)
    在org.apache.tools.ant.taskdefs.SQLExec $ Transaction.runTransaction(SQLExec.java:664)
    在org.apache.tools.ant.taskdefs.SQLExec $ Transaction.access $ 000(SQLExec.java:627)
    在org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:370)


解决方案

由于@Reza Goodarzi提到的原因的无效的SQL语句的是分号被用作语句分隔符。因此,要解决我的问题,我与分离每个语句斜杠(/)作为分隔符,并遵循这些规则,我创造了自己:


  1. 每个SQL语句(而不是PL / SQL块的一部分)和PL / SQL块必须在一个新行转发的斜线(/)结束。


  2. SQL语句(而不是PL / SQL块的一部分)不应分号结束( )。我只是删除分号语句的结束。


  3. 有关PL / SQL块不删除分号。从块的结束,以及从包含的块中的任何声明(


和通过在我的SQL脚本,这些变化我执行(使用JDBC)每个 PL / SQL块的每个 SQL语句(而不是PL / SQL块的一部分)的在通过解析自己的文件,而不是使用时间的 SQLEXEC 的或任何其他外部API /库。

I am using Oracle 11g, I am executing Oracle sql script through java code. My SQL script may contain SQL statements(DDL or DML) or PL/SQL blocks, so I don't want to parse the script in my java code but used This solution to execute complete script at once. Following is the sample code, where SQLExec class is in ant jar.

This solution worked for most cases except that if sql script contains create or replace trigger it fails with java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement. I have also specified snippet of sql script which fails.

Please note that if I run same script through SQL Developer, it runs fine.

Following is the Java code:

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 Script snippet:

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

Following is the Exception trace:

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)

解决方案

As @Reza Goodarzi mentioned the cause of invalid SQL statement is semicolon being used as the statement separator. So to solve my issue I am separating each statement with slash(/) as delimiter and followed these rules which I created myself:

  1. Each SQL statement (not part of PL/SQL block) and PL/SQL block must end with a forwarded slash (/) in a new line.

  2. SQL statement (not part of PL/SQL blocks) should not end with semicolon (;). I just removed semicolon from the end of statements.

  3. For PL/SQL block do not remove the semicolon(;) from end of the block as well as from any statement contained within the block.

And by making these changes in my SQL Scripts I executed (using jdbc) each PL/SQL block and each SQL statement (not part of PL/SQL block) at a time by parsing the file myself instead of using SQLExec or any other external api/library.

这篇关于从Java运行Oracle SQL脚本给SQLSyntaxErrorException:ORA-00900:无效的SQL语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆