【发布时间】:2015-01-10 18:58:47
【问题描述】:
这是关于通过多个级别的 PL/SQL 过程进行错误处理的最佳实践问题。我查看了其他一些问题来帮助我,特别是 this one。
目前,我有一个带有过程 1 的程序,它调用过程 2,它调用过程 3。我正在尝试执行足够的错误处理 - 但我想最终将确切的问题输出回应用层。我希望能就如何有效而清晰地做到这一点获得一些想法。
我目前的解决方法如下,但对我来说似乎相当混乱,有很多变量声明。我对 PL/SQL(以及一般的 SQL)非常陌生,所以我很感激任何关于以下方面的建议:
- 处理多层过程时的良好错误处理技术。
- 将错误消息反馈到应用层(在我下面的过程中,由“out_overall_output”变量表示。
程序流程:UI -> Proc 1 -> Proc 2 -> Proc 3
程序 1:
--One input variable, one output.
in_id VARCHAR2;
out_overall_output VARCHAR2;
...
DECLARE
l_success BOOLEAN;
l_error_output VARCHAR2(100);
BEGIN
Proc2(id, l_success, l_error_output);
IF l_success = FALSE THEN
out_overall_output = l_error_output
END IF
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
out_overall_output:= 'Error calling Proc 2'
RETURN;
END;
--Normal flow continues if l_success is true...
程序 2:
-- One input variable, two output.
in_id
out_success
out_error_output
//other logic
DECLARE
l_success BOOLEAN;
l_error_output VARCHAR2(100)
BEGIN
Proc3(id, l_success, l_error_output)
IF l_success = FALSE THEN
out_error_output = l_error_output
END IF
EXCEPTION
WHEN OTHERS
out_error_output = 'Error calling Proc 3'
RETURN;
END;
程序 3:
--One input variable, two output.
in_id VARCHAR2;
out_success BOOLEAN;
out_error_message VARCHAR2;
...
BEGIN
DELETE
FROM table
WHERE id = in_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
out_success = FALSE;
out_error_message = 'Error - No data to delete'
WHEN OTHERS THEN
out_success = FALSE;
out_error_message = 'Error deleting data.'
END;
注意:过程调用的层次比这更深。我展示的 sn-ps 大大简化了。我的真实程序中的错误信息和变量名更具描述性。
【问题讨论】:
-
通常,您应该避免通过参数传递错误,而是使用
RAISE和/或RAISE_APPLICATION_ERROR在过程之间传递错误。在您的示例中,您会在错误发生时立即掩盖错误,这意味着当您遇到意外错误时,您将不知道真正的错误是什么。 -
@Allan:您能否为我详细解释一下?据我了解,如果我在程序 3 中遇到“当其他人”错误,我会跟踪它并将其传递给链条。这是否意味着我不会知道真正的错误是什么?
-
在上述最后一个过程中,如果出现
OTHERS错误,您总是会收到消息“调用过程2 时出错”。是数字溢出错误吗?类型转换错误?分布式事务错误?从字面上看,它可能有数以千计的错误消息。您通过将错误替换为通用消息来隐藏所有这些信息。
标签: oracle stored-procedures plsql exception-handling