如何使用过程显示所有异常

时间:2013-06-24 05:27:56

标签: plsql

我正在编写程序,我传递输入值。我需要验证元数据,如果没有有效的引发异常。使用oracle异常我已经验证了条件然后引发了异常。我复制了用于验证的代码。

IF V_BUSN_APPLC_NM_COUNT = 0 THEN
        RAISE INVALID_SYSTEM_IDENTIFER;
    END IF;

    IF V_PROCES_TYPE_COUNT = 0 THEN
        RAISE INVALID_PROCES_TYPE;
    END IF;

根据我的逻辑,它应该显示两个值,但只显示一条消息。如何显示这两个消息。

两个IF都会执行吗?如果是这样,为什么不打印这两个值。

在java中我们将错误视为一个数组,然后添加到数组并显示数组元素列表。我们在oracle中有这样的事吗。

2 个答案:

答案 0 :(得分:1)

如果你想将它保存在一个数组中,你可以这样做:

/* package with exceptions */
CREATE OR REPLACE PACKAGE exception_pkg AS
    composite_exception EXCEPTION;
END exception_pkg;

/* procedure */
DECLARE
    TYPE errors_ntt IS TABLE OF VARCHAR2(100);
    l_errors  errors_ntt := errors_ntt();
BEGIN
    DECLARE
        /* set variables to get errors */
        V_BUSN_APPLC_NM_COUNT NUMBER := 0;
        V_PROCES_TYPE_COUNT   NUMBER := 0;
    BEGIN
        IF V_BUSN_APPLC_NM_COUNT = 0 THEN
            /* add error to array */
            l_errors.EXTEND;
            l_errors(l_errors.LAST) := 'INVALID_SYSTEM_IDENTIFER';
        END IF;

        IF V_PROCES_TYPE_COUNT = 0 THEN
            l_errors.EXTEND;
            l_errors(l_errors.LAST) := 'INVALID_PROCES_TYPE';
        END IF;

        IF l_errors.COUNT > 0 THEN
            RAISE exception_pkg.composite_exception;
        END IF;
    END;
EXCEPTION
    WHEN exception_pkg.composite_exception THEN
        FOR indx IN 1..l_errors.COUNT LOOP
            /* print results */
            DBMS_OUTPUT.PUT_LINE(l_errors(indx));
        END LOOP;
        RAISE;
END;
/*
INVALID_SYSTEM_IDENTIFER
INVALID_PROCES_TYPE
*/

答案 1 :(得分:0)

异常的第一次引发结束了程序的执行,因此不会执行更多的代码。

如果需要显示所有值,则必须使用带有OUT参数的过程(无例外)或在错误消息中使用这两个值引发一个异常。