一个过程调用一个函数。它处理几个表,所以我把它分成块。所有的块都有自己的异常部分,在那里特定的错误信息可以通过电子邮件发送。
现在,我想让代码更简洁,并按以下顺序传递异常:块-〉它的函数-〉调用程序
我可以用'raise'来做,但是在这种情况下,调用程序不知道异常来自哪里。
我认为另一个解决方案是第一个块将使用raise_application_error(User-Error-Id,'Specific error messages')。但是在这种情况下,原始的SQLCODE被raise_application_error隐藏了。
我该如何解决这个问题?
我有这样的话:
procedure main
...
begin
v_pcs := calc_pcs(parameters);
exception
When others then
dbms_output.put_line(SCLCODE || ' - ' || SQLERRM);
-- Here I'd like to read the part of the code where the exception happened
end;
funcion calc_pcs(
parameters
) as
begin
-- first block
begin
v_return := 5 / 0; -- just an example of an error
exception
when others then
raise -- How to add text to predefined exception. For example 'FirstBlock || SqlErrM'
end;
...
rest of the code contains additional blocks with their exception handling and
there is other code without blocks
...
return v_return;
Exception
when others then
raise;
end;
谢谢Sayan!对不起,我可能在上一篇文章中遗漏了一些重要的东西,让我澄清一下。我想将一个占位符文本连接到起始块的原始预定义异常字符串中,例如“First Block”||“divisor is equal to zero”。进一步的异常处理将传递此沿着,同时SQLCODE保持不变。
1条答案
按热度按时间yfjy0ee71#
你可以这样做:
数据库小键盘:https://dbfiddle.uk/s7HeZpNB
数据库管理系统输出: