我总结了几个,但是都有缺点:
1 dbms_output.put_line
缺点是如果不set serveroutput on 日志就无法显示
2 写日志表
缺点是,存储过程异常,日志就会丢失。 并且写表数据库消耗大 (当然,这是个小问题)
3 自治事务写日志表
缺点是,数据库消耗大(因为每写一条日志都是一个事务)
4 调用utl_file写日志
缺点是,只能在数据库服务器使用,并且需要创建directory的权限。这个不是开发、维护人员轻易能获得的
==================================
不知道大家有没有其它更好的办法
------解决方案--------------------
2 写日志表
缺点是,存储过程异常,日志就会丢失。 并且写表数据库消耗大 (当然,这是个小问题)
存储过程异常会进入exception的,在exception中也记录日志啊?
为什么会丢失呢?
------解决方案--------------------
用job执行的,不是有日志吗?
------解决方案--------------------
4 调用utl_file写日志
缺点是,只能在数据库服务器使用,并且需要创建directory的权限。这个不是开发、维护人员轻易能获得的
你连这个权限都没有还用数据库记录日志?
所有存储过程加上几个out参数返回错误信息,日志直接在应用程序代码里写。
------解决方案--------------------
为什么在exception中一定要rollback呢?为什么不能commit呢?
exception
when others then
insert into log values(...);
commit;
end;
------解决方案--------------------
create procedure pro_a_testlogrollback as
v_val number;
begin
insert into a_testdata values(3);
v_val := 1/0;
exception
when others then
rollback;
insert into a_testlog values(sysdate,'异常操作已经回滚');
commit;
end;
------解决方案--------------------
楼上正解, 可以写一个函数,专门用来记录日志, exception中,先rollback;后调用函数进行日志的插入。
------解决方案--------------------
这正好啊,utl_file写在服务器上,由专人负责。
对应库也不是很多人都可以维护吧
------解决方案--------------------
出异常,也可以把相应信息写到日志里