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

2 sql oracle plsql stored-procedures

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

Dav*_*ann 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;
/
Run Code Online (Sandbox Code Playgroud)

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

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;
/
Run Code Online (Sandbox Code Playgroud)

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

  • 这里的表 PROCESSING_LOG 如果有人需要:`创建表 PROCESSING_LOG(MESSAGE_DATE timestamp, MESSAGE_TEXT varchar2(4000));` (3认同)