Oracle 存储过程日志文件

Posted

技术标签:

【中文标题】Oracle 存储过程日志文件【英文标题】:Oracle Stored Procedure Log File 【发布时间】:2016-05-11 06:43:41 【问题描述】:

我有一个 oracle 程序,它选择数据并插入另一个表。下面是代码。

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
     IS   
BEGIN
  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;
END;
/

我想知道如何将事件输出到表格中。像流程开始时间戳,流程结束时间戳和异常中的错误消息。所以日志表中会有两列,如日期和消息。有什么建议么?

【问题讨论】:

您希望日志包含哪些内容?每次执行时你想要一个新文件,还是累积日志?您将如何运行该过程,您希望将日志记录在服务器上还是客户端计算机上? 如果它用于服务器端,那么您可以使用 utl_file。用这个词谷歌,你会得到足够的信息。 @Alex Poole 我很想知道如何在客户端机器上生成过程日志? 无法将 DBMS_OUTPUT 重定向到文件。 Oracle 没有内置(应用程序)日志记录。因此,如果您想这样做,您将需要编写自己的实现,或者,如果您愿意记录到表而不是文件,请向下 the Logger package from Github @PravinSatav - 假脱机,脚本输出重定向......并不是说这是明智或安全的,即使该过程总是希望以某种方式调用 - 只是想弄清楚 OP 的目标是什么为了。目前不确定他们想要记录什么。 @Alex Poole - 感谢您提供的信息。知道如何做到这一点.... 【参考方案1】:
create or replace procedure my_log (action in varchar2, message in varchar2 )
is

begin
  Insert into my_log_table (ACTION, MESSAGE, EVENT_DATE)
  values (action, message, sysdate);
  commit;
end;
/
CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" ()
IS   
   err_num NUMBER;
   err_msg VARCHAR2(4000);
BEGIN
    my_log ('Start','My message');
  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;
  my_log ('End','My message');
  EXCEPTION
  WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SQLERRM;
my_log ('Error' , errnum ||' - ' || err_msg);
 END;
/

【讨论】:

创建或替换过程“CUSTOMER_INCREMENTAL”(右括号在哪里? 程序无法编译。 my_log 上应该有一个自主提交指令【参考方案2】:

按照other answer 中的建议,记录到表要容易得多,但与其编写自己的记录过程,不如使用LOGGER,它有很好的文档记录和测试。

以下是文档中的示例:

begin
  logger.log('This is a debug message. (level = DEBUG)');
  logger.log_information('This is an informational message. (level = INFORMATION)');
  logger.log_warning('This is a warning message. (level = WARNING)');
  logger.log_error('This is an error message (level = ERROR)');
  logger.log_permanent('This is a permanent message, good for upgrades and milestones. (level = PERMANENT)');
end;
/

select id, logger_level, text
from logger_logs_5_min
order by id;

  ID LOGGER_LEVEL TEXT
---- ------------ ------------------------------------------------------------------------------------------
  10       16     This is a debug message. (level = DEBUG)
  11        8     This is an informational message. (level = INFORMATION)
  12        4     This is a warning message. (level = WARNING)
  13        2     This is an error message (level = ERROR)
  14        1     This is a permanent message, good for upgrades and milestones. (level = PERMANENT)

【讨论】:

以上是关于Oracle 存储过程日志文件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle ETL日志审计存储过程示例

oracle警告日志文件ALERT.LOG的作用及其存储位置等

oracle中的存储过程怎么写

oracle的存储过程怎么写?

oracle存储过程代码日志记录

Oracle定时任务执行存储过程备份日志记录表