在Oracle存储过程中记录错误消息

时间:2009-10-14 18:34:56

标签: sql oracle stored-procedures plsql

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

4 个答案:

答案 0 :(得分:12)

如果您决定滚动自己的日志记录并登录到表格,则可以使用自治交易路线。

自治交易是一种可以独立于您当前交易而提交的交易。

这样,您可以独立于存储过程或批处理父事务的成功或失败,将所需的所有信息记录并提交到日志表。

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调用中写入的数据仍然存在,但父事务仍然可以回滚。

答案 1 :(得分:1)

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

log4plsql页面列出了它可以记录的各种地方。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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