逐步进度oracle plsql的日志记录

时间:2017-05-31 09:33:23

标签: oracle logging plsql

我有一个message_log表,其中包含ID,严重级别,消息,日志日期&时间。

我使用以下过程在我的PL / SQL脚本中将日志消息插入日志表。

add_log(ID,'START','DEBUG','No CDR Detail to be processed', sysdate);    

但是如果失败,我会看到一些消息没有被记录。记录plsql进度的逐步进度(如果需要,直到失败点)的最佳方法是什么?

create or replace procedure add_log 
        (stp varchar2, code varchar2, log_message varchar2, logdat date)
    is 

begin

    insert into message_log 
    (SEQ,PROC_STEP,
    CODE,
    LOG_MESSAGE,
    LOG_DATE
    )
    values 
    (log_SEQ.NEXTVAL,stp,code,log_message,logdat)
    ;

end;

1 个答案:

答案 0 :(得分:2)

  

"如果失败,我不会看到某些消息被记录。记录plsql进度的逐步进度的最佳方法是什么(如果需要,直到失败点)。"

你的ADD_LOG()程序没有包含commit - 大概是你依靠更广泛的事务来保存日志记录。问题是,如果更广泛的事务失败,它会回滚并带上你的日志消息。

这是自治事务编译指示的少数合法用途之一。这会创建一个独立的事务(一个嵌套的会话),因此我们可以在不影响外部事务的情况下提交。

create or replace procedure add_log (stp varchar2, code varchar2, log_message varchar2, logdat date)
is 
    PRAGMA AUTONOMOUS_TRANSACTION;
begin
    insert into message_log 
    (SEQ,PROC_STEP,
    CODE,
    LOG_MESSAGE,
    LOG_DATE
    )
    values 
    (log_SEQ.NEXTVAL,stp,code,log_message,logdat)
    ;
    COMMIT;  
end;

如果对ADD_LOG()进行此更改,则无论调用事务发生什么情况,都将提交所有邮件。