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

Oracle 使用Ant构建PL/SQL包时需要获取错误/警告,oracle,ant,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

使用下面的代码,我可以编译一个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,成功与否

我也试过了 每当SQLERROR退出SQL.code时,
每当SQLERROR退出警告SQL.code时

但没有区别


有什么想法吗?

经过更多的搜索和实验,我找到了解决方案。 基本上,您必须使用'where SQLERROR EXIT WARNING SQL.CODE'并通过查询用户错误表来捕获错误。基于

请注意,
每当SQLERROR EXIT WARNING SQL.code
时,都不会得到分号,因为它是SQLPlus指令,并且包之间需要有斜杠。
脚本将在出现第一个错误时停止,但我们将其用于测试部署,因此包应该在我们的开发数据库中工作。

我不懂java,也不确定是否理解您的要求,但是:编译包总是没有错误。编译错误不是SQL或PL/SQL异常。也许您可以分析输出消息?类似的问题:这不是Java问题,也不是PL/SQL创建错误消息的问题。我们正在运行一个构建PL/SQL包的Ant脚本。如果包构建失败,Ant脚本仍会发出“success”。
<target name="RunExec">
    <exec executable="sqlplus" failonerror="true" errorproperty="exit.status" logError="true">
        <arg line="domain/secret@datasource"/>
        <arg value='@${buildPackage.sql}'/>    
    </exec>
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;
/