经验总结:Oracle之Package

1.使用Package实现数据集合输出

<span style="font-size:10px;"><span style="font-family:Microsoft YaHei;">create or replace package pack_name is

  -- Author  : YANGEZHI
  -- Created : 2016/4/14 17:59:54
  -- Purpose :

  -- Public type declarations
  type rowcurcor is ref cursor;<span style="color:#ff0000;">--声明输出游标</span>

  --声明存储过程
  procedure proc_query(v_querydate in varchar2,v_querytype in varchar2,v_counttype in varchar2, v_ip in varchar2,<span style="color:#ff0000;">countList out rowcurcor</span>);
  --声明多个存储过程
  procedure proc_queryAll(v_itemId in varchar2,countList out rowcurcor);

end pack_name;</span>
</span>

create or replace package body pack_name as

 <span style="color:#ff0000;"> --在包体中实现存储过程</span>
  procedure proc_query(v_querydate in varchar2,
                                v_querytype in varchar2,
                                v_counttype in varchar2,
                                v_ip        in varchar2,
                                countList out rowcurcor) as
   <span style="color:#ff0000;"> --v_querydate 查询日期:now-按当前时间查询;日期值-需要查询的截止日期
    --v_querytype 查询类型:1-物理内存 2-交换分区 3-CPU使用率 4-磁盘
    --v_counttype 统计类型:0-按小时 1-按日 2-按周 3-按月
    --v_ip        主机IP地址
    --rate        (数据库配置)频率:以min(分钟)为计量单位</span>

    nowdate        varchar2(20); --当前时间
    maxdata        varchar2(100); --最大值
    mindata        varchar2(100); --最小值
    avgdata        varchar2(100); --平均值
    v_startdate    varchar2(20); --开始时间
    v_enddate      varchar2(20); --结束时间
    i              int := 1; --查询次数循环变量
    countnum       int; --查询次数
    v_execsql  varchar2(300); --查询SQL
    v_tempexcsql   varchar2(500);
    v_tempwheresql varchar2(200);
    sequencenum    varchar2(20);
    v_rate varchar2(5);

  begin

    if v_querydate='now' then
      nowdate := to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss');
    else nowdate := v_querydate||' 00:00:00';
    end if;

    <span style="color:#ff0000;">--删除历史数据并提交</span>
    delete from aim_temp_hostcount where serialno like to_char(sysdate,'yyyy-mm-dd')||'%';
    commit;

    <span style="color:#ff0000;">--判断查询类型,赋值SQL语句</span>
    case
      when v_querytype = '1' then
        v_execsql := 'select max(replace(pmem, ''%'','''')),min(replace(pmem, ''%'','''')),round(avg(replace(pmem, ''%'','''')),2)
         from aim_host_memruninfo_rep';
      when v_querytype = '2' then
        v_execsql := 'select max(used/total*100),min(used/total*100),round(avg(used/total*100),2)
         from aim_host_memswap_rep';
      when v_querytype = '3' then
        v_execsql := 'select max(us+sys),min(us+sys),round(avg(us+sys),2)
         from aim_host_cpuruninfo_rep';
      when v_querytype = '4' then
        v_execsql := 'select max(kb_read) || ''|'' || max(kb_write),min(kb_read) || ''|'' || min(kb_write),round(avg(kb_read),2) || ''|'' || round(avg(kb_write),2)
         from aim_host_diskio_rep';
      else
        v_execsql := '';
    end case;

    <span style="color:#ff0000;">--查询统计频率</span>
    select rate into v_rate from AIM_CONF_HOSTCOUNT where counttype=v_counttype;

    <span style="color:#ff0000;">--计算查询循环次数</span>
    case
      when v_counttype = '0' then
        countnum := (60 / v_rate); --0-按小时(60min/rate)
      when v_counttype = '1' then
        countnum := (24 * 60 / v_rate); --1-按日(24*60/rate)
      when v_counttype = '2' then
        countnum := (7 * 24 * 60 / v_rate); --2-按周(7*24*60/rate)
      when v_counttype = '3' then
        countnum := (30 * 24 * 60 / v_rate); --3-按月(30*24*60/rate)
      else
        countnum := 0;
    end case;

    <span style="color:#ff0000;">--获取流水</span>
    select to_char(sysdate,'yyyy-mm-dd')||SEQUENCE_HOSTCOUNT.Nextval into sequencenum from sys.dual;

    while i <= countnum loop
      maxdata := 0;
      mindata := 0;
      avgdata := 0;
      <span style="color:#ff0000;">--计算开始、结束时间</span>
      v_startdate := to_char(to_date(nowdate, 'yyyy-mm-dd hh24:mi:ss') -
                             (v_rate * i / 1440),
                             'yyyy-mm-dd hh24:mi:ss');
      v_enddate   := to_char(to_date(nowdate, 'yyyy-mm-dd hh24:mi:ss') -
                             (v_rate * (i - 1) / 1440),
                             'yyyy-mm-dd hh24:mi:ss');

      v_tempwheresql := ' where ip='''|| v_ip || ''' and server_date || '' '' || server_time >= '''|| v_startdate || '''
         and server_date || '' '' || server_time < ''' || v_enddate ||  '''';

      <span style="color:#ff0000;">--执行SQL</span>
      v_tempexcsql := v_execsql || v_tempwheresql;

      EXECUTE IMMEDIATE v_tempexcsql
        into maxdata,mindata,avgdata;

      --插入临时表
      insert into aim_temp_hostcount values(sequencenum,nvl(maxdata,'-'),nvl(avgdata,'-'),nvl(mindata,'-'),v_enddate);

      i := i + 1;
    end loop;
    --提交临时表数据
    commit;

    <span style="color:#ff0000;">--返回结果集</span>
    open countList for select * from aim_temp_hostcount where serialno=sequencenum order by servertime asc;

  end proc_query;
  
end pack_name;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值