首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从java运行Oracle脚本将给出SQLSyntaxErrorException: ORA-00900:无效sql语句。

从java运行Oracle脚本将给出SQLSyntaxErrorException: ORA-00900:无效sql语句。
EN

Stack Overflow用户
提问于 2013-12-20 14:28:47
回答 4查看 17.6K关注 0票数 0

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

此解决方案在大多数情况下都有效,但如果sql脚本包含java.sql.SQLSyntaxErrorException:或00900:无效create or replace trigger语句,则会失败。我还指定了失败的sql脚本片段。

请注意,如果我通过运行相同的脚本,它就运行得很好。

以下是代码:

代码语言:javascript
复制
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脚本片段:

代码语言:javascript
复制
......
......
CREATE OR REPLACE TRIGGER MY_TRG
   BEFORE INSERT ON MY_TABLE
   FOR EACH ROW
   BEGIN
    :NEW.MYNUMBER := MY_SEQUENCENUM.NEXTVAL;
   END;

以下是异常跟踪:

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-26 14:25:45

正如@Reza提到的,无效SQL语句的原因是分号被用作语句分隔符。因此,为了解决我的问题,我用slash(/)作为分隔符将每个语句分开,并遵循我自己创建的规则:

  1. 每个SQL语句(不是PL/SQL块的一部分)和PL/SQL块必须在新行中以转发斜杠(/)结尾。
  2. SQL语句(不是PL/SQL块的一部分)不应该以分号(;)结尾。我刚从陈述的结尾去掉了分号。
  3. 对于PL/SQL块,不要从块的末尾以及块中包含的任何语句中删除分号()。

通过对我的SQL脚本进行这些更改,我一次执行(使用jdbc)、每个PL/SQL块和每个SQL语句(不是PL/SQL块的一部分),方法是自己解析文件,而不是使用SQLExec或任何其他外部api/库。

票数 1
EN

Stack Overflow用户

发布于 2013-12-20 14:51:06

文档中,它说:

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-12-20 14:35:31

我认为你需要改变你的扳机设置你的新身份证

代码语言:javascript
复制
create or replace trigger MY_TRG
BEFORE insert MY_TABLE
for each row
begin
  if (:new.MYNUMBER  is null) then
    select MY_SEQUENCENUM.nextval
    into :new.MYNUMBER 
    from DUAL;
  end if;
end;
/

或者这个:

代码语言:javascript
复制
create or replace trigger TG_BIU_TABLE1
before insert or update on TABLE1
for each row
begin
    if (:new.ID1 is null) then
        select SQ_TABLE1.nextval
        into :new.ID1
        from DUAL
    end if
end
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20705807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档