我正在编写程序,我传递输入值。我需要验证元数据,如果没有有效的引发异常。使用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中有这样的事吗。
答案 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参数的过程(无例外)或在错误消息中使用这两个值引发一个异常。