在oracle apex中使用sqlerm和异常时抛出重复的错误代码

时间:2019-03-26 12:12:19

标签: oracle exception plsql oracle-apex

我正在Oracle Apex 5.0中创建一个过程。请帮助我摆脱一些重复的错误代码。

我有多种情况需要抛出错误。但是,在该块的末尾,当我用Exception编写sqlerrm块时,它将抛出两次错误代码。

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

exception
    when others then
        raise_application_error(-20003, SQLERM);
end;

现在,如果由于那些IF语句而发生任何错误,那么结果将类似于

  

ORA-20001: ORA-20003: ----statement1----

但是我需要显示例如

  

ORA-20001: ----statement1----

我如何得到它?请帮助我在这里找到应该做什么。

1 个答案:

答案 0 :(得分:3)

RAISE_APPLICATION_ERROR引发定制错误。但是,就像应用程序可能抛出的其他任何异常一样,它也被本地异常处理程序捕获。

您的异常处理程序针对所有错误引发了一个新的定制异常。不要这样您可以通过删除异常块轻松解决​​问题。所有异常将在不进行任何修改的情况下在调用堆栈中传播。

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

end;

或者,您可以使用用户定义的异常。

declare
    x_condition2 exception;
    x_condition3 exception;
begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise x_condition2;

    elseif(<condition 3>) then
        raise x_condition3;

    end if;

exception
    when x_condition2 then
        raise_application_error(-20001, '----statement1----');
    when x_condition3 then
        raise_application_error(-20002, '----statement2----');

end;

除非您有一些特定处理,您想将其应用于所有错误(例如记录错误),否则您无需费心。重新传播处理程序部分中的异常没有任何价值,因为默认情况下会进行传播。


@深入询问

  

我们不能同时例外吗?

是的,我们可以这样做:

declare
    x_condition2 exception; 
    PRAGMA EXCEPTION_INIT(x_condition2,-20001); 
    x_condition3 exception; 
    PRAGMA EXCEPTION_INIT(x_condition3,-20002);
….

声明异常将创建定制的异常。 PRAGMA EXCEPTION_INIT将定制的错误号与该异常关联。我不会在匿名块中这样做,因为我们没有从中获得太多价值。我们仍然需要执行raise_application_error来返回定制的错误消息。

pragma exception_init真正有用的地方是当我们在程序单元之间传递异常时。需要通过调用程序处理的异常应在程序包规范中声明。使用pragma exception_init意味着我们可以使用sqlcode识别错误,这对于诸如从表中查找标准错误消息,提供用户帮助文本等任务很有帮助。