日志中的Oracle完整错误消息

时间:2017-04-18 09:34:55

标签: oracle oracle11g exception-handling

我正在尝试从oracle获取完整的错误消息。

例如 - 我有一个很长的程序,在

上做了很多操作

很多对象,在我的日志中我收到了错误

  

对象不再存在。

这是我对日志的插入(即使这是一个普遍的问题 - 不是特定于这个例子):

EXCEPTION WHEN OTHERS THEN
       v_errno := sqlcode;
       V_ERRMSG := SQLERRM;
       INSERT INTO ERR_TABLE (ERROR_NUMBER, ERROR_MESSAGE,PROGRAM#)
       VALUES (V_ERRNO, V_ERRMSG,'MY_PKG');
       COMMIT;

问题在于我不知道它在谈论哪个表 - 因为这个

信息不存在。

有办法搞定吗?

我猜oracle将它保存在某个地方。

谢谢!

1 个答案:

答案 0 :(得分:1)

对于内部日志记录(不仅仅是错误),我使用如下过程:

PROCEDURE Put(
        LogMessage IN T_LOG_ENTRIES.LOG_MESSAGE%TYPE,
        ErrCode IN T_LOG_ENTRIES.LOG_ERROR_CODE%TYPE DEFAULT 0) IS

    ErrorStack T_LOG_ENTRIES.LOG_ERROR_STACK%TYPE;
    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

    IF ErrCode <> 0 THEN
        ErrorStack := DBMS_UTILITY.FORMAT_ERROR_BACKTRACE();
        ErrorStack := SQLERRM(ErrCode) || CHR(13) || ErrorStack;
    END IF;

    INSERT INTO T_LOG_ENTRIES 
        (LOG_DATE, LOG_MESSAGE, LOG_ERROR_CODE, LOG_ERROR_STACK) 
    VALUES 
        (CURRENT_TIMESTAMP, LogMessage, ErrCode, ErrorStack);
    COMMIT;
END Put;

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()提供完整的错误堆栈。您应该使用AUTONOMOUS_TRANSACTION,因为在发生异常时回滚事务,即您的日志消息也将被删除。

然后您可以使用该过程,例如:

BEGIN
...
EXCEPTION WHEN OTHERS THEN
   Put('Error in my procedure', sqlcode);
END;