【问题标题】:step by step progress logging for oracle plsqloracle plsql的逐步进度记录
【发布时间】:2017-05-31 09:33:23
【问题描述】:

我有一个带有 ID、严重级别、消息、日志日期和时间的 message_log 表。

我正在使用以下过程将日志消息插入到我的 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;

【问题讨论】:

  • 在您的 PLSQL 脚本中使用正确的 exception handling,并将其用于向日志插入消息。
  • 您是在add_log 过程中还是在PL/SQL 块中调用add_log 之后提交事务?

标签: oracle logging plsql


【解决方案1】:

“在失败的情况下,我没有看到一些消息被记录。记录 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() 进行此更改,则无论调用事务发生什么,您的所有消息都将被提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2023-01-25
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多