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

Posted

技术标签:

【中文标题】在 oracle apex 中使用 sqlerm 和异常时抛出重复的错误代码【英文标题】:Duplicate error code throws while using sqlerm and exception in oracle apex 【发布时间】:2019-03-26 12:12:18 【问题描述】:

我正在 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;

现在,如果由于这些 IF 语句而发生任何错误,那么结果将如下所示

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

但我需要显示像,例如

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

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

【问题讨论】:

【参考方案1】:

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;

除非您有某些特定处理要应用于所有错误(例如记录错误),否则您仍然无需担心 WHEN OTHERS。仅仅在处理程序部分重新引发异常没有任何价值,因为传播是默认发生的。


@Deep 问

我们不能同时做两个例外吗?

是的,我们可以这样做:

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 识别错误,这对于从表格中查找标准错误消息、提供用户帮助文本等任务很有帮助。

【讨论】:

只是好奇,我们不能同时做两个例外吗? x_condition2 exception; x_condition3 exception; PRAGMA EXCEPTION_INIT(x_condition2,-20001); PRAGMA EXCEPTION_INIT(x_condition3,-20002); 然后提出你如何提出的异常?

以上是关于在 oracle apex 中使用 sqlerm 和异常时抛出重复的错误代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle APEX 中使用替换变量

无法在 Oracle apex 中使用匿名块更新字段

由于日期格式,从 Apex 表单调用 Oracle SP 失败

Oracle APEX - 处理 APEX 内部错误

在 Oracle APEX 中访问报表输出表

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名