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

zu0ti5jz  于 2023-05-16  发布在  Oracle
关注(0)|答案(4)|浏览(117)

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

qv7cva1a

qv7cva1a1#

登录到临时表可能是一个很好的解决方案.例如,您可以创建一个简单的日志记录表,如下所示:

create table PROCESSING_LOG(
    MESSAGE_DATE timestamp,
    MESSAGE_TEXT varchar2(4000)
);

如果您决定将自己的日志记录和日志记录滚动到表中,您可能会采用自治事务路线。
自治事务是指可以独立于当前事务提交的事务。
这样,您就可以将所需的所有信息记录并提交到日志表中,而与存储过程或批处理父事务的成功或失败无关。

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

lhcgjxsq

lhcgjxsq2#

您可以使用log 4plsql http://log4plsql.sourceforge.net/,并在以后通过更改配置而不是更改代码来更改选择
log 4plsql页面给出了它可以记录的各种位置的列表。
它还取决于如何在你的环境中监控应用程序和系统-如果有一个标准的方法,例如我工作过的一个企业使用irc进行监控-那么你可能需要一个调用它的函数。

rur96b6h

rur96b6h3#

你说你对DB环境没有太多的控制来安装日志记录包--如果是这种情况,那么你将被限制在DBA_SCHEDULER_JOB_RUN_DETAILSDBA_SCHEDULER_JOB_LOG系统视图中查询信息--你将能够在这里看到执行历史(或者在当前用户的相应视图中,ALL_SCHEDULER_JOB_RUN_DETAILSALL_SCHEDULER_JOB_LOG)。
未处理的异常将显示在ADDITIONAL_INFO列中。如果您需要通知,您可以轮询这些视图并生成电子邮件。
Oracle 19文档:

7xzttuei

7xzttuei4#

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

相关问题