|
(time,
code,
message,
package_name,
procedure_name,
location,
parameters)
values (sysdate,
p_error_code,
p_error_message,
p_package,
p_procedure,
p_location,
p_parameters);
commit;
end log;
end pkg_error;
|
其中pragma autonomous_transaction部分是十分重要的,因为你保证log方法能够将日志数据提交到数据表中,否则要提交过程中导致错误发生的任何相关信息。这就是pragma段完成的功能。它告诉Oracle将该过程作为原子操作,不能影响早期调用堆栈中的任何信息。
当然最后一步是将日志信息应用到代码中。例如,比如说你有一个简单的小函数,并且无论何时发生异常,你都希望能够记录它且还要避免再次发生错误。换句话说,记录错误并使应用能够继续运行。你可能需要做以下工作:
CREATE OR REPLACE FUNCTION hello_world RETURN VARCHAR2 IS
v_ procedure errorlog.procedure_name%TYPE default 'hello_world';
v_ location errorlog.location%TYPE;
BEGIN
v_location := 1000;
return ('hello, world');
EXCEPTION
when others then
pkg_error.log(p_error_code => substr(sqlerrm,1,9),
p_error_message => substr(sqlerrm,12),
p_package => 'FUNCTION',
p_procedure => v_procedure,
p_location => v_location);
END;
|
很明显,如果是在包内,你需要根据你创建的包的实际名称创建一个全局变量,并将它传递给p_package参数替代我们此处使用的字符串常量。
这非常相似,我并不想说这是PL/SQL中记录错误的最好方法。我从事这方面的工作只有一年多,所以无论如何我都不是一个专家。
但是这种记录方法使得调试我的应用程序变得十分简单。如果出现某个错误,我们会有一个所有出错过程和函数的记录,因此,我们可以很快追踪问题的根源。
共2页: 上一页 [1] 2 下一页
|