我正在使用Oracle 11g,正在通过Java代码执行Oraclesqlhtml" target="_blank">脚本。我的SQL脚本可能包含SQL语句(DDL或DML)或PL /SQL块,因此我不想解析Java代码中的脚本,但使用此解决方案立即执行了完整的脚本。以下是示例代码,其中包含SQLExec类antjar
。
此解决方案在大多数情况下都有效,除了如果sql脚本包含create or replace trigger
它会失败,并显示
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)
正如@Reza Goodarzi提到的, _无效SQL语句_的原因是使用分号作为语句分隔符。因此,为了解决我的问题,我将每个语句都用slash(/)
定界符分隔,并遵循我创建的以下规则:
每个SQL语句(不属于PL / SQL块的一部分)和PL / SQL块必须在换行符中以转发的斜杠(/)结尾。
SQL语句(不是PL / SQL块的一部分)不应以分号( ; )结尾。我只是从语句末尾删除了分号。
对于PL / SQL块,请勿从块末尾以及该块内包含的任何语句中删除分号( ; )。
通过在我的SQL脚本中进行这些更改,我自己解析文件而不是使用 SQLExec 或任何其他外部api,一次执行(使用jdbc)每个 PL / SQL块
和每个 SQL语句(不是PL / SQL块的一部分) /图书馆。 __
我正在使用Oracle 11g,我正在通过java代码执行Oracle sql脚本。我的SQL脚本可能包含SQL语句(DDL或DML)或PL/SQL块,所以我不想在我的java代码中解析脚本,而是使用此解决方案一次执行完整的脚本。下面是示例代码,其中SQLExec类位于ant jar中。 此解决方案适用于大多数情况,但如果sql脚本包含,则会因java.sql.SQLSyntaxErrorExce
我已使用以下代码创建了一个Oracle SP。如果我从SQLDeveloper执行它,那么它运行时不会出现任何错误/问题。但是,当我尝试从.NET代码调用同一SP时,将引发一个异常,并显示消息“Oracle.DataAccess.Client.OracleException:ORA-00900:invalid SQL statement”。 Oracle SP代码: 我的VB.NET代码: 有什么
我正在尝试创建一个与DAO.sql链接的DAO接口。stg字符串模板文件。查询非常简单,只需按id选择。 MyDao.groovy: MyDao.sql.stg: 我的后端数据库是甲骨文。我在甲骨文SQLDeveloper中尝试过这个查询,它工作得很好,但是当我使用应用程序和sql.stg文件运行查询时,它会给我: 我怀疑它不知怎么找不到sql。stg文件,即使我在POM中包含了资源目录。 如何让
在Oracle的SQL developer中,我创建了一个名为BBS_COUNT_base的表,其定义如下: 我还使用以下语句在表中插入了一条记录: 现在,使用SQLDeveloper,我可以使用 将基本edn值更新为(在本测试案例中)相同的值。 但是,当我试图将此语句传递给clojure.java.jdbc/query时,JDBC驱动程序错误输出,标题中显示了错误。有人知道为什么JDBC驱动程序
我正在尝试应用biopython代码来分割一个大的fasta文件。代码如下所示: 在这一行中:对于i,枚举中的批处理(批处理迭代器(record_iter,93)):正在给我语法错误:无效语法。但是我看不到错误,有人能帮我找到吗?我从这里取了密码http://biopython.org/wiki/Split_large_file谢谢
我在尝试从Java运行R脚本时遇到了一个问题。我真的在互联网上寻找这个问题的答案,但什么都不管用。 求你帮帮我 这是java代码 以下是当我添加Runtime.getRuntime(). exec("Rcript"rScriptFileName)时抛出的错误消息: