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

Sql 在Oracle存储过程中记录错误消息,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我们计划使用Oracle DBMS调度程序包将存储过程配置为每天作为批处理作业运行。我们想知道发生错误时记录错误消息的最佳方法是什么。是否可以将日志记录到临时表?还是有更好的选择。提前感谢。这取决于你将如何处理错误:如果你只需要得到通知,电子邮件是最好的选择;如果您需要手动继续处理错误,该表是一个不错的选择。您可以使用log4plsql,稍后通过配置更改而不是代码更改来更改选择 log4plsql页面给出了它可以记录的各种地方的列表 它还取决于在您的环境中如何监控应用程序和系统—如果有一种标准的

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

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

您可以使用log4plsql,稍后通过配置更改而不是代码更改来更改选择

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


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

如果您决定使用自己的日志记录并登录到一个表中,您可能会选择自主事务路径

自治事务是可以独立于当前事务提交的事务

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

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

如果您说您对DB环境没有太多的控制权来安装日志软件包-如果是这种情况,那么您将仅限于查询dba_调度程序、作业、运行、详细信息和dba_调度程序、作业、日志系统视图中的信息-您将能够在此处查看执行的历史记录。未处理的异常将显示在附加信息列中。如果您需要通知,您可以轮询这些视图并生成电子邮件。

谢谢您的回答,我们无法像安装新的日志包那样控制DB环境。我们如何发送电子邮件?是否有PL/SQL内置功能?如果有人需要,这里是表处理日志:
create table PROCESSING_LOG(MESSAGE_DATE timestamp,MESSAGE_TEXT varchar2(4000))当您有此功能时,谁需要第三方日志包?很简单。并且在发生错误时不会与其他代码一起回滚。