我正在使用Oracle 11g,正在通过Java代码执行Oraclesql脚本。我的SQL脚本可能包含SQL语句(DDL或DML)或PL /SQL块,因此我不想解析Java代码中的脚本,但使用此解决方案立即执行了完整的脚本。以下是示例代码,其中包含SQLExec类antjar。
antjar
此解决方案在大多数情况下都有效,除了如果sql脚本包含create or replace trigger它会失败,并显示 java.sql.SQLSyntaxErrorException:ORA-00900:无效的SQL语句 。我还指定了失败的sql脚本片段。
create or replace trigger
请注意,如果我通过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)
正如@Reza Goodarzi提到的, _无效SQL语句_的原因是使用分号作为语句分隔符。因此,为了解决我的问题,我将每个语句都用slash(/)定界符分隔,并遵循我创建的以下规则:
slash(/)
每个SQL语句(不属于PL / SQL块的一部分)和PL / SQL块必须在换行符中以转发的斜杠(/)结尾。
SQL语句(不是PL / SQL块的一部分)不应以分号( ; )结尾。我只是从语句末尾删除了分号。
对于PL / SQL块,请勿从块末尾以及该块内包含的任何语句中删除分号( ; )。
通过在我的SQL脚本中进行这些更改,我自己解析文件而不是使用 SQLExec 或任何其他外部api,一次执行(使用jdbc)每个 PL / SQL块 和每个 SQL语句(不是PL / SQL块的一部分) /图书馆。 __