ANT sql任务:如何运行SQL和PL / SQL并注意执行失败?
要从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,则任务将失败。 这可以通过使用下面的代码来解决:
<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”。 我试图设置的错误属性不会返回任何错误代码。
任何想法/建议如何解决这个问题?
谢谢,
彼得
彼得,
在脚本的开头添加
WHENEVER SQLERROR EXIT SQL.CODE;
然后sqlplus将以退出码!= 0退出。
我想很晚 - 但我希望这会帮助某人:
一般来说,我认为我们应该使用sql而不是执行可执行文件=“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>
然后将结果提供给: <sql delimeter="/" src="myScript.sql"/>
解释:如果你有常规的sql命令:
drop table x;
select blah from blue where bli=blee;
他们将转变为:
drop table x
/
select blah from blue where bli=blee
/
这是平等的 - 和“/”delimeter的sql命令可以处理它们。
另一方面,
BEGIN
blah
END;
/
将转变为:
BEGIN
blas
END/
/
并使用第二个正则表达式 - 转换回
BEGIN
blas
END;
/
所以大家都赢了! 欢呼!
祝你好运。
链接地址: http://www.djcxy.com/p/44339.html上一篇: ANT sql task: How to run SQL and PL/SQL and notice execution failure?