我正在尝试从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将它保存在某个地方。
谢谢!
答案 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;