实时监控存储过程中应用的日志信息

       几年前开发人员问我,要怎样解决存储过程在执行过程中,能实时看到日志生

成,因为无论采用DBMS_OUTPUT还是dbms_system.ksdwrt,只能在存储过程执

行完成之后才生成日志信息。这个问题一直困扰了我多年,但很幸运能看到一位韩

国的数据库专家Dion Cho博客中提供的脚本,解决了这个困扰多年的问题。

以下具体的脚本:

1、创建包

create or replace package pkg_log
    as
      type log_array is table of varchar2(4000);
        procedure log(message in varchar2);
        procedure flush;
        function get_log return log_array pipelined;
    end;
    /

create or replace package body pkg_log
    as
        procedure log(message in varchar2) is
            v_status number;
        begin
            dbms_pipe.pack_message(sysdate || ', ' || message);
        v_status := dbms_pipe.send_message('log');
        end log;
     
        procedure flush is
            v_status number;
        begin
            dbms_pipe.pack_message('$$END$$');
            v_status := dbms_pipe.send_message('log');
        end;
     
        function get_log return log_array pipelined is
            v_status  number;
            v_message varchar2(4000);
        begin
            while true loop
                v_status := dbms_pipe.receive_message('log');
            if v_status = 0 then
            dbms_pipe.unpack_message(v_message);
            if v_message = '$$END$$' then
                return;
            end if;
            pipe row(v_message);
            pipe row('');
            end if;
            end loop;
            return;
        end get_log;
    end;
 /

2、测试
-- session #1                                                                                                    
  begin                                                                                                        
      for idx in 1 .. 10 loop                                                                                  
          pkg_log.log(idx || 'th insertion');
          dbms_lock.sleep(1);                                                                                  
      end loop;                                                                                                
      pkg_log.flush;                                                                                           
  end;                                                                                                         
  /               

 -- session #2                                                                                                
  set array 2                                                                                                  
  set pages 100                                                                                                
  select * from table(pkg_log.get_log);     

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/354732/viewspace-624007/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/354732/viewspace-624007/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值