使用以下命令我可以编译PL / SQL包。
<exec executable="sqlplus" failonerror="true" errorproperty="exit.status" logError="true">
<arg line="MyUser/MyPassword@MyDatasource"/>
<arg value='@C:\public\data_svn\trunk\DataBase_Scripts\packages\FSMP_PACKAGE.pkb'/>
</exec>
但如果它有错误,它仍会记录成功的构建。我试图从exec中获取错误代码,但没有得到 - 或者0,成功与否。
我也试过了
WHENEVER SQLERROR EXIT SQL.CODE;
和
WHENEVER SQLERROR EXIT WARNING SQL.CODE;
但没有区别。
有什么想法吗?
答案 0 :(得分:0)
经过一些搜索和实验后,我找到了解决方案。 基本上你必须使用`WHENEVER SQLERROR EXIT WARNING SQL.CODE&#39;并通过查询USER_ERROR表捕获错误。基于http://grokbase.com/t/ant/user/048v9ah8eq/compiling-pl-sql
<target name="RunExec">
<exec executable="sqlplus" failonerror="true" errorproperty="exit.status" logError="true">
<arg line="domain/secret@datasource"/>
<arg value='@${buildPackage.sql}'/>
</exec>
在buildPackage.sql
中WHENEVER SQLERROR EXIT WARNING SQL.CODE
@C:\packages\FSMP_PACKAGE.pks
BEGIN
DECLARE
NUM INTEGER;
ERROR_TEXT USER_ERRORS.TEXT%TYPE;
BEGIN
SELECT Count(*) INTO NUM FROM USER_ERRORS WHERE Type
= 'PACKAGE' AND NAME = 'FSMP_PACKAGE';
If num > 0 Then
SELECT TEXT INTO ERROR_TEXT FROM USER_ERRORS WHERE
Type = 'PACKAGE' AND NAME = 'FSMP_PACKAGE';
RAISE_APPLICATION_ERROR(-20000, ERROR_TEXT, True);
End IF;
END;
END;
/
@C:\packages\FSMP_PACKAGE.pkb
BEGIN
DECLARE
NUM INTEGER;
ERROR_TEXT USER_ERRORS.TEXT%TYPE;
BEGIN
SELECT Count(*) INTO NUM FROM USER_ERRORS WHERE Type
= 'PACKAGE BODY' AND NAME = 'FSMP_PACKAGE';
If num > 0 Then
SELECT TEXT INTO ERROR_TEXT FROM USER_ERRORS WHERE
Type = 'PACKAGE BODY' AND NAME = 'FSMP_PACKAGE';
RAISE_APPLICATION_ERROR(-20000, ERROR_TEXT, True);
End IF;
END;
END;
/
请注意WHENEVER SQLERROR EXIT WARNING SQL.CODE
没有分号,因为它是一个SQLPlus指令,并且需要在包之间使用斜杠。
该脚本将在第一个错误时暂停,但我们将其用于测试部署,因此这些包应该在我们的开发数据库中有效。