ANT sql任务:如何运行SQL和PL/SQL并注意执行失败?

Pet*_*ter 15 sql ant plsql

从ANT执行.sql脚本文件它使用以下任务正常工作:

<sql
    classpath="${oracle.jar}" driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@@@{db.hostname}:@{db.port}:@{db.sid}" 
    userid="@{db.user}" 
    password="@{db.password}"
    src="@{db.sql.script}" />
Run Code Online (Sandbox Code Playgroud)

但是,如果.sql文件不仅包含纯SQL而且还包含PL/SQL,则任务将失败.这可以通过使用以下代码段来解决:

<sql
    classpath="${oracle.jar}" driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@@@{db.hostname}:@{db.port}:@{db.sid}" 
    userid="@{db.user}" 
    password="@{db.password}"
    delimiter="/"
    delimitertype="row"
    src="@{db.sql.script}" />
Run Code Online (Sandbox Code Playgroud)

但是如果我的脚本包含SQL PL/SQL,那么ANT任务都不会起作用.另一个解决方案是使用"exec"任务和"sqlplus":

<exec executable="sqlplus" failonerror="true" errorproperty="exit.status">
    <arg value="${db.user}/${db.password}@${db.hostname}:${db.port}/${db.sid}"/>
    <arg value="@${db.sql.script}"/>
</exec>
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这个任务永远不会失败,因此即使sql脚本执行失败,构建也总是返回"SUCCESSFUL".我尝试设置的error属性不会返回任何错误代码.

任何想法/建议如何解决这个问题?

谢谢,

彼得

Mic*_*sov 6

彼得,

在脚本的开头添加

  WHENEVER SQLERROR EXIT SQL.CODE;
Run Code Online (Sandbox Code Playgroud)

然后sqlplus将退出退出代码!= 0.


use*_*710 6

很晚,我猜 - 但我希望这会对某人有所帮助:

一般来说,我认为我们应该更多地使用sql而不是exec executable ="sqlplus",原因很多,例如:如果我们更改数据库提供程序,你不会在使用sql的新进程中花费资源,"STOPPING"将起作用而不是sqlplus.exe等.

无论如何,这里有一个建议如何让PL/SQL和SQL在同一个脚本中,以便它可以工作:

myScript.sql:


<copy todir="...">
  <fileset dir="...." includes="myScript.sql"/>
  <filterchain>
    <replaceregex byline="false" pattern=";" replace="{line.separator}/" flags="mg"/>
    <replaceregex byline="false" pattern="/[\s]*/" replace=";${line.separator}/"  flags="mg"/>
   </filterchain>
</copy>
Run Code Online (Sandbox Code Playgroud)

然后将结果给出: <sql delimeter="/" src="myScript.sql"/>

解释:如果你有常规的sql命令:

drop table x;
select blah from blue where bli=blee;
Run Code Online (Sandbox Code Playgroud)

他们将转变为:

drop table x
/
select blah from blue where bli=blee
/
Run Code Online (Sandbox Code Playgroud)

这是相当的 - 而带有"/"分隔符的sql命令可以处理它们.

另一方面,

BEGIN
  blah
END;
/
Run Code Online (Sandbox Code Playgroud)

将转变为:

BEGIN
  blas
END/
/
Run Code Online (Sandbox Code Playgroud)

并使用第二个正则表达式 - 转换回

BEGIN
  blas
END;
/
Run Code Online (Sandbox Code Playgroud)

所以每个人都赢了!欢呼!

祝好运.