Oracle 通过Ant执行SQL脚本

Oracle 通过Ant执行SQL脚本,oracle,ant,Oracle,Ant,我有一个工作的SQL脚本,.SQL文件,用于Oracle,当我从SQL Developer执行时,它工作得很好,但现在我试图从ANT脚本调用它,这给我带来了很多与语法相关的错误 在我的目标是通过Ant?/P>执行SQL脚本时,我需要考虑的是什么? 下面来自.sql文件的一条语句在SQLDeveloper中运行得非常好,但是Ant抛出了语法错误 myuser@myserver:/app/myapp/myAnt/install $ ant TestSQL Buildfile: /app/myapp/

我有一个工作的SQL脚本,
.SQL
文件,用于Oracle,当我从SQL Developer执行时,它工作得很好,但现在我试图从ANT脚本调用它,这给我带来了很多与语法相关的错误

在我的目标是通过Ant?/P>执行SQL脚本时,我需要考虑的是什么? 下面来自
.sql
文件的一条语句在SQLDeveloper中运行得非常好,但是Ant抛出了语法错误

myuser@myserver:/app/myapp/myAnt/install $ ant TestSQL
Buildfile: /app/myapp/myAnt/install/build.xml

TestSQL:
      [sql] Executing resource: /app/myapp/myAnt/install/config/SQL/CleanDB.sql
      [sql] Failed to execute:  SET SERVEROUTPUT ON

BUILD FAILED
/app/myapp/myAnt/install/build.xml:32: java.sql.SQLSyntaxErrorException: ORA-00922: Fehlende oder ungültige Option
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1033)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1909)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1871)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:318)
    at org.apache.tools.ant.taskdefs.SQLExec.execSQL(SQLExec.java:775)
    at org.apache.tools.ant.taskdefs.SQLExec.runStatements(SQLExec.java:745)
    at org.apache.tools.ant.taskdefs.SQLExec$Transaction.runTransaction(SQLExec.java:1055)
    at org.apache.tools.ant.taskdefs.SQLExec$Transaction.access$000(SQLExec.java:985)
    at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:653)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:392)
    at org.apache.tools.ant.Target.performTasks(Target.java:413)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:811)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

总时间:1秒

我的理解是,
上设置SERVEROUTPUT是一个SQL*Plus命令,而不是SQL语句,Ant
SQL
任务使用的JDBC驱动程序不理解它

因此,您可能需要使用
exec
任务从Ant调用PL/SQL,类似如下:

<exec executable="${oracle.bin.dir}/sqlplus" failonerror="true">
  <arg value="${username}/${password}@${tns_alias}"/>
  <arg value="@${script.path}/my_script.sql"/>
</exec>

您的SQL脚本没有被添加,但是我假设使用delimiterdelimitertype属性可能会有所帮助

不确定上面提到的exec任务,因为它不是一个通用的解决方案(我建议尽可能使用SQLAnt任务来支持不同的数据库提供程序)


祝你好运

你打算怎么跑,您可以将sql语句封装在一个文件中,并通过
exec
ant任务以shell脚本调用的形式运行?如果您可以同时显示ant和sql脚本,那就太好了。另外,至少根据Google translate的说法,“Fehlende order ungültige Option”在英语中被翻译成“缺少或无效选项”。要挑剔的是,
SET SERVEROUTPUT ON
不是PL/SQL,它是一个SQL*Plus命令。其他工具,如SQLDeveloper,也可以理解它。但是,正如您所建议的,在Ant构建文件中使用
exec
任务来运行SQL*Plus并不能改变这一事实。@Luke谢谢您的纠正。我据此编辑了答案。