使用Ant构建PL / SQL包时需要获取错误/警告

时间:2014-11-14 19:08:19

标签: oracle ant

使用以下命令我可以编译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;

但没有区别。

有什么想法吗?

1 个答案:

答案 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指令,并且需要在包之间使用斜杠。 该脚本将在第一个错误时暂停,但我们将其用于测试部署,因此这些包应该在我们的开发数据库中有效。