【问题标题】:ANT sql task: How to run SQL and PL/SQL and notice execution failure?ANT sql 任务:如何运行 SQL 和 PL/SQL 并注意执行失败?
【发布时间】:2011-03-22 18:12:03
【问题描述】:

要从 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}" />

但如果 .sql 文件不仅包含纯 SQL,还包含 PL/SQL,则任务将失败。这可以通过使用以下 sn-p 来解决:

<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}" />

但如果我的脚本同时包含 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>

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

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

谢谢,

彼得

【问题讨论】:

    标签: sql ant plsql


    【解决方案1】:

    彼得,

    在脚本开头添加

      WHENEVER SQLERROR EXIT SQL.CODE;
    

    然后 sqlplus 将以退出代码 != 0 退出。

    【讨论】:

      【解决方案2】:

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

      一般来说,我认为我们应该更喜欢使用 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>
      

      然后将结果提供给: &lt;sql delimeter="/" src="myScript.sql"/&gt;

      说明: 如果你有常规的 sql 命令:

      drop table x;
      select blah from blue where bli=blee;
      

      它们将被转换为:

      drop table x
      /
      select blah from blue where bli=blee
      /
      

      这是等价的 - 带有“/”分隔符的 sql 命令可以处理它们。

      另一方面,

      BEGIN
        blah
      END;
      /
      

      将转换为:

      BEGIN
        blas
      END/
      /
      

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

      BEGIN
        blas
      END;
      /
      

      所以每个人都赢了!万岁!

      祝你好运。

      【讨论】:

      • 我尝试用斜杠替换分号,效果很好。但是,我有一些带有分号的包创建脚本。如果我用斜杠替换分号 ant 会成功执行 sql 脚本,但由于错误 Encountered symbol / 而创建的所有包都存在编译错误,有什么方法可以解决这个问题吗?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多