我想创建抛出应用程序错误的过程。此程序应放在单独的包中。
procedue Raise_Error(error_code) is
err t_Error;
begin
err:= error_list(error_code);
raise_application_error(err.error_number, err.message);
end;
所以我在包中创建了类型:
type t_Error is record (error_number INTEGER, message VARCHAR2(200));
type t_Error_List is table of t_Error index by VARCHAR(30);
error_list t_Error_List ;
如何创建错误常量列表,如下所示:
const1 t_Error := t_Error (-200001, 'first message');
const2 t_Error := t_Error (-200002, 'second message');
error_list ('code1') := const1;
error_list ('code2') := const2;
非常感谢。 鲍勃
答案 0 :(得分:1)
您可以在包的begin
/ end
块中创建错误表(将为每个调用包的会话创建错误表),但是您无法实例化这样的记录;您需要单独设置字段值:
create package body error_pkg as
procedure Raise_Error(error_code in varchar2) is
err t_Error;
begin
err := error_list(error_code);
raise_application_error(err.error_number, err.message);
end Raise_Error;
begin
error_list ('code1').error_number := -20001;
error_list ('code1').message := 'first message';
error_list ('code2').error_number := -20002;
error_list ('code2').message := 'second message';
end error_pkg;
/
使用虚拟PL / SQL块来调用过程:
begin
error_pkg.raise_error('code2');
end;
/
Error report:
ORA-20002: second message
ORA-06512: at "STACKOVERFLOW.ERROR_PKG", line 6
ORA-06512: at line 2
我不确定这是个好主意。您正在丢失原始问题的堆栈跟踪 - 您不知道raise_error
调用的来源。也许这对你自己的错误无关紧要;但是如果你正在捕捉一个真正的例外并且相反地调用它,那将是一个坏主意。