oracle 块->其函数->调用程序方式中的文本异常

6pp0gazn  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(174)

一个过程调用一个函数。它处理几个表,所以我把它分成块。所有的块都有自己的异常部分,在那里特定的错误信息可以通过电子邮件发送。
现在,我想让代码更简洁,并按以下顺序传递异常:块-〉它的函数-〉调用程序
我可以用'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保持不变。

yfjy0ee7

yfjy0ee71#

你可以这样做:

declare
  e1 exception;
  e2 exception;
  e3 exception;
  pragma exception_init(e1, -20201);
  pragma exception_init(e2, -20202);
  pragma exception_init(e3, -20203);

  procedure func ( x int, txt varchar2 ) is
  begin
    case x
      when 1 then raise_application_error(-20201, 'x = ['||x||'] error text 1: ' || txt);
      when 2 then raise_application_error(-20202, 'x = ['||x||'] error text 2: ' || txt);
      when 3 then raise_application_error(-20203, 'x = ['||x||'] error text 3: ' || txt);
      else null;
    end case;
  end func;
begin -- main block:
  func(2, 'test');
exception
  when e1 then 
    dbms_output.put_line('e1');
    dbms_output.put_line(SQLCODE || ' - ' || SQLERRM);
  when e2 then 
    dbms_output.put_line('e2');
    dbms_output.put_line(SQLCODE || ' - ' || SQLERRM);
  when e3 then 
    dbms_output.put_line('e3');
    dbms_output.put_line(SQLCODE || ' - ' || SQLERRM);
end;
/

数据库小键盘:https://dbfiddle.uk/s7HeZpNB
数据库管理系统输出:

e2
-20202 - ORA-20202: x = [2] error text 2: test

相关问题