执行包体后如何从错误信息中删除额外信息?

时间:2016-02-01 12:21:44

标签: plsql

我想在执行包体之后从错误消息中删除额外的信息。

示例:

如果我运行匿名阻止,则错误消息就像 -

ERROR at line 1:
ORA-20010: Object ID PE556092 is not Produced by the Template TP000036
ORA-06512: at "EXAMPLE.TESTPROC", line 5
ORA-06512: at line 1

但我想只显示以下错误消息:

ORA-20010: Object ID PE556092 is not Produced by the Template TP000036

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容分别获取错误代码和消息:

dbms_output.put_line('Error code: '||sqlcode); 
dbms_output.put_line('Error msg: '||sqlerrm);

详细了解SQLERRM

答案 1 :(得分:0)

您可以通过定义异常并将其映射到引发错误的SQLCODE来实现。然后处理异常处理程序中的逻辑。

示例,这里我映射到错误-20010(您正在使用的错误):

declare
   err_obj_not_produced   exception;
   pragma exception_init (err_obj_not_produced, -20010);

   l_object               varchar2 (50);
   l_template             varchar2 (50);
begin
   run_your_code ('With values');
exception
   when err_obj_not_produced then
      return 'Object ID ' || l_object || ' is not Produced by the Template ' || l_template;
end;

答案 2 :(得分:0)

另一种隐藏先前错误信息的方法。假设您有两个程序:

create or replace procedure proc1 is
begin
  raise no_data_found;
end;
/

create or replace procedure proc2 is
begin
  proc1;
exception
  when no_data_found then
    raise_application_error(-20010, 'There is no spoon, Neo.');
end;
/

当你在SQL * Plus中运行一个块时,你得到:

SQL> begin
  proc2;
end;
/

begin
*
ERROR at line 1:
ORA-20010: There is no spoon, Neo.
ORA-06512: at "DEV.PROC2", line 6
ORA-06512: at line 2

您可以像这样更改proc2

create or replace procedure proc2 is
begin
  proc1;
end;
/

并按照预期结果调用它:

SQL> begin
  begin
    proc2;
  exception
    when no_data_found then
      raise_application_error(-20010, 'There is no spoon, Neo.', false);
  end;
exception
  when others then
    dbms_output.put_line(SQLERRM);
end;
/

ORA-20010: There is no spoon, Neo.

PL/SQL procedure successfully completed.

此示例显示raise_application_error过程的第三个参数如何工作。如果传递false,则过程将从错误堆栈中删除有关先前引发的异常的信息。使用dbms_utility.format_error_backtrace也无法获取此信息 正如Jon Heller在评论中注意到的那样,隐藏异常信息是一种不好的做法(并且正如Jeffry Kemp注意到的那样使用when others then而不是raise),所以,我希望你知道你在做什么。这样或那样,这是一个自己在脚下射击。