【问题标题】:Log error messages in Oracle stored procedure在 Oracle 存储过程中记录错误消息
【发布时间】:2010-12-06 19:00:54
【问题描述】:

我们计划使用 Oracle DBMS 调度程序包将存储过程配置为每天作为批处理作业运行。我们想知道当发生错误时记录错误消息的最佳方式是什么。记录到临时表是一种选择吗?还是有更好的选择。提前致谢。

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

    如果您决定滚动自己的日志记录并登录到表中,您可能会采用 Autonomous Transaction 路线。

    自治事务是可以独立于您所在的当前事务提交的事务。

    这样,您可以记录并提交您想要的所有信息到您的日志表中,而与您的存储过程或批处理父事务的成功或失败无关。

    CREATE OR REPLACE PROCEDURE "SP_LOG" (
        P_MESSAGE_TEXT VARCHAR2
    ) IS
      pragma autonomous_transaction;
    BEGIN
    
        DBMS_OUTPUT.PUT_LINE(P_MESSAGE_TEXT);
    
        INSERT INTO PROCESSING_LOG (
            MESSAGE_DATE,
            MESSAGE_TEXT
        ) VALUES (
            SYSDATE,
            P_MESSAGE_TEXT
        );
        COMMIT;
    
    END;
    /
    

    然后,如果您这样调用它,即使您遇到故障并回滚事务,您仍然可以将消息提交到您的日志表:

    BEGIN
      SP_LOG('Starting task 1 of 2');
    
      ... code for task 1 ...
    
      SP_LOG('Starting task 2 of 2');
    
      ... code for task 2 ...
    
      SP_LOG('Ending Tasks');
    
      ... determine success or failure of process and commit or rollback ... 
    
     ROLLBACK;
    END;
    /
    

    您可能希望用对您的代码有意义的异常来整理它,但这是一般的想法,写入 SP_LOG 调用中的数据仍然存在,但仍可以回滚父事务。

    【讨论】:

    • 如果有人需要,这里是 PROCESSING_LOG 表:create table PROCESSING_LOG( MESSAGE_DATE timestamp, MESSAGE_TEXT varchar2(4000) );
    • 当你有这个时谁需要 3rd 方日志包?就是这么简单。并且在发生错误时不会与您的其他代码一起回滚。
    【解决方案2】:

    您可以使用 log4plsql http://log4plsql.sourceforge.net/并稍后通过更改配置而不是更改代码来更改选择

    log4plsql 页面列出了它可以记录的各个位置。

    这还取决于在您的环境中如何监控应用程序和系统 - 如果有一种标准方式,例如我工作的企业添加使用 irc 进行监控 - 那么您可能需要一个调用它的函数。

    【讨论】:

      【解决方案3】:

      您说您对安装日志记录包的数据库环境没有太多控制 - 如果是这种情况,那么您将仅限于查询 dba_scheduler_job_run_details 和 dba_scheduler_job_log 系统视图中的信息 - 您将可以在这里看到处决的历史。未处理的异常将显示在 ADDITIONAL_INFO 列中。如果您需要通知,您可以轮询这些视图并生成电子邮件。

      【讨论】:

        【解决方案4】:

        这取决于您将如何处理错误:如果您只需要收到通知,电子邮件是最佳选择;如果您需要手动继续处理错误,该表是不错的选择。

        【讨论】:

        • 感谢您的回答,我们对数据库环境没有太多控制权,例如安装新的日志包。我们如何发送电子邮件?是否有 PL/SQL 内置功能?
        猜你喜欢
        • 2012-01-25
        • 2011-12-30
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 2013-04-01
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多