Oracle 过程日志事件

Oracle Procedure Log Events

下面是我的程序。

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
   IS   
BEGIN

  INSERT INTO PROC_LOG (START_DATE,OUTPUT) VALUES (sysdate,Process Started);

  INSERT INTO NDB_AML_CUSTOMER 
   (ID, TITLE,...)
  SELECT ID, TITLE,... 
   FROM NDB_CUSTOMER_NEW
   WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW');

  UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW';

  COMMIT; 

    INSERT INTO PROC_LOG (END_DATE,OUTPUT) VALUES (sysdate,Process Ended);

END;
/

我想将日志事件输出到 table。例如,事件调用 "Process started" 的过程的开始日期和时间,过程结束日期和时间以及异常期间的错误消息。 Log_table 中的三列,开始日期、结束日期和输出。寻求专家的意见。

您可以像本文 Exception handling 中提到的那样捕获过程中的异常。对于开始和结束日期的记录,您可以使用简单的插入语句。

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
   IS   
BEGIN

  Process start event

INSERT INTO LOG_TABLE(ID, START_DATE, END_DATE, MESSAGE) VALUES (ID, SYSDATE, NULL, NULL);

  INSERT INTO NDB_AML_CUSTOMER 
   (ID, TITLE,...)
  SELECT ID, TITLE,... 
   FROM NDB_CUSTOMER_NEW
   WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW');

  UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW';

  COMMIT;
  UPDATE LOG_TABLE SET END_DATE = SYSDATE WHERE ID = ID;
  Process End event

EXCEPTION

WHEN OTHERS THEN
UPDATE LOG_TABLE SET END_DATE = SYSDATE, MESSAGE = EXCEPTION_MESSAGE WHERE ID = ID;

END;

类似这个片段的东西

我有一个单独的进程日志包,可以将消息输出到我的日志 table(使用 pragma autonomous transaction),以及使用 dbms_application_info 以便您可以看到什么是会话查询 v$session 时做的事情。

然后我在我的实际代码包中有包装程序,它传递包信息、日志消息类型(信息、错误等)。

我强烈建议您查看 https://oracle-base.com/articles/misc/instrumenting-your-plsql-code,因为 Tim 提供了他的日志包示例供您查看。