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



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

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

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

相关内容

最新更新