我想在执行包体之后从错误消息中删除额外的信息。
示例:
如果我运行匿名阻止,则错误消息就像 -
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
答案 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
),所以,我希望你知道你在做什么。这样或那样,这是一个自己在脚下射击。