在oracle apex中使用sqlerm和exception时引发重复的错误代码

在oracle apex中使用sqlerm和exception时引发重复的错误代码,oracle,exception,plsql,oracle-apex,Oracle,Exception,Plsql,Oracle Apex,我正在Oracle Apex 5.0中创建一个流程。请帮我清除一些重复的错误代码 我有多个需要抛出错误的条件。但是在块的末尾,当我使用sqlerrm编写Exception块时,它会抛出两次错误代码 begin ----------------------------- -----some code statements---- ----------------------------- if (<condition 1>) then

我正在Oracle Apex 5.0中创建一个流程。请帮我清除一些重复的错误代码

我有多个需要抛出错误的条件。但是在块的末尾,当我使用
sqlerrm
编写
Exception
块时,它会抛出两次错误代码

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;
开始
-----------------------------
-----一些代码语句----
-----------------------------
如果()那么
-----------------
----一些代码----
-----------------
elsif()那么
raise_应用程序_错误(-20001),----语句1----);
那么埃尔塞夫呢
raise_应用程序_错误(-20002),'----语句2---';
如果结束;
例外
当其他人
引发应用程序错误(-20003,SQLERM);
结束;
现在,若由于这些if语句而发生任何错误,那个么结果将如下所示

ORA-20001:ORA-20003:----语句1---

但我需要表现得像,比如说

ORA-20001:----语句1----


我怎样才能得到它?请帮助我找到我应该在这里做什么。

RAISE\u APPLICATION\u错误抛出一个定制错误。但与应用程序可能抛出的任何其他异常一样,它被本地异常处理程序捕获

您的异常处理程序正在为任何和所有错误引发新的定制异常。不要这样做。通过删除异常块,可以轻松解决问题。所有异常都将在调用堆栈中传播,无需任何修改

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;
声明异常将创建一个定制异常。PRAGMA EXCEPTION_INIT将定制错误号与该异常关联。我不会费心在匿名块中这样做,因为我们没有从中获得多少价值。我们仍然需要执行
raise\u application\u error
来返回定制的错误消息


当我们在程序单元之间传递异常时,
pragma exception\u init
变得非常有用。需要调用程序处理的异常应该在包规范中声明。使用
pragma exception\u init
意味着我们可以使用
sqlcode
识别错误,这对于从表中查找标准错误消息、提供用户帮助文本等任务很有帮助。

只是好奇,我们不能同时进行这两种异常吗<代码>x_条件2异常;x_条件3例外;PRAGMA EXCEPTION_INIT(x_condition2,-20001);PRAGMA EXCEPTION_INIT(x_condition3,-20002)然后引发异常您是如何引发的?
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);
….