2014-11-06 178 views
1

也许一个愚蠢的问题,而是说我有像这样(大大简化为简洁起见)一个记录程序:数据库日志记录在日志记录过程

PROCEDURE LOGGER (
    p_TYPEOFLOG    IN VARCHAR2, 
    p_LOGSEVERITY   IN VARCHAR2, 
    p_SESSIONID    IN VARCHAR2) 
AS 
    v_timestamp    DATE := SYSDATE; 

BEGIN 

    PRAGMA autonomous_transaction; 

    BEGIN 
     INSERT INTO Log (
      TypeOfLog, LogSeverity, SessionID, TimeOfAction) 
     VALUES (
      p_TYPEOFLOG, p_LOGSEVERITY, p_SESSIONID, v_timestamp); 
     COMMIT; 
    END; 

END LOGGER; 

现在,通常我会换行开始/结束位了一个异常处理程序,它将调用此记录程序。但是如果我已经在记录仪中,我该怎么办?如果其他人为空并跳过它,我是否仅仅执行异常?我是否尝试再次调用记录程序?这里的标准是什么?

+0

如果您再次调用Logger过程,并再次失败 - 如果它是一个更广泛的问题,如空间用完,请说 - 如何防止无限递归添加到您的问题? Oracle可能会试图终止递归,但是你也会尝试记录它... – 2014-11-06 16:28:59

回答

4

我不认为有“标准”这样的东西。个人而言,如果我的日志代码失败,我会让任何生成的异常被抛出并传播到堆栈中。如果你不能写Log表,那意味着发生了非常不幸的事情。我不想赶上并忽略这种例外。如果没有其他记录错误的方法,我会将异常提交给调用者,并期望调用者将消息显示给用户(即前端Web应用程序中的堆栈跟踪)或将消息记录到应用程序服务器日志。

+0

[我的PL/SQL日志记录工具在这里](https://github.com/peihanw/plsql_runlog)。希望能有所帮助。 – peihan 2016-01-18 02:49:03