Oracle函数返回数组

 CREATE OR REPLACE TYPE defect_number3 AS OBJECT(
    ID varchar2(100),
    urgent NUMBER(10,2),
    major NUMBER(10,2),
    norm NUMBER(10,2),
    total NUMBER(10,2)
    )
create or replace type defect_number_array as TABLE OF defect_number3 
 
以前项目中写过的一个函数:
create or replace function f_get_defect_total_onerate(timeRangeStart  in varchar2,
                                                 timeRangeEnd    in varchar2,
                                                 deviceClassify  in varchar2,
                                                 voltageLevel    in varchar2,
                                                 defectStatus    in varchar2,
                                                 company         in varchar2,
                                                 vyear           in varchar2,
                                                 devicePart      in varchar2,
                                                 deviceFactory   in varchar2,
                                                 defectClass     in varchar2,
                                                 devicePlantYear in varchar2,
                                                 deviceType in varchar2,
                                                 defectLevel in varchar2)
  return defect_number_array is
  --在年份不确定的条件下,该函数的最大年份为2011
  --timeRangeStart  开始时间
  --timeRangeEnd    结束时间
  --voltageLevel    电压等级  该项可以传入多个值,每个值之间使用英文逗号隔开“,”
  --company         供电局ID
  --deviceClassify    设备类别
  --defectStatus      缺陷等级
  ---使用该函数的时候,需要判断返回结果是否为空,可参考以下
  ----SELECT  * from TABLE(f_pub_get_defect_rate('20120101','20120131','20024','13, 12, 11, 10','','1909','22'));
  var_out      defect_number3 := defect_number3(-1, -1, -1, -1, -1);
  var_outt      defect_number3 := defect_number3(-1, -1, -1, -1, -1);
  resultdefect defect_number_array := defect_number_array();
 
  minYear          number;
  maxYear          number;
  vtimeRangeStart  varchar2(512);
  vtimeRangeEnd    varchar2(512);
  v2timeRangeStart varchar2(512);
  v2timeRangeEnd   varchar2(512);
  urgent number(10,2);
  major number(10,2);
  norm number(10,2);
  total number(10,2);
   years number(10);
begin
  if ('empty' != NVL(vyear, 'empty')) then
    --电压等级
    minYear := SUBSTR(timeRangeStart, 0, 4);
    select f_get_defect_rate(timeRangeStart,
                             timeRangeEnd,
                             deviceClassify,
                             voltageLevel,
                             defectStatus,
                             company,
                             minYear,
                             devicePart,
                             deviceFactory,
                             defectClass,devicePlantYear,deviceType,defectLevel)
      into var_out
      from dual;
    resultdefect.extend();
    resultdefect(resultdefect.last) := var_out;
 
  else
    vtimeRangeStart := timeRangeStart;
    vtimeRangeEnd   := timeRangeEnd;
    if ('empty' = NVL(timeRangeStart, 'empty')) then
      vtimeRangeStart := '0101';
      vtimeRangeEnd   := '1231';
    end if;
    if('empty' != NVL(company, 'empty')) then
               select min(record_defect_year) into minYear from dim_operation_unit where id = company;
    else
               select min(record_defect_year) into minYear from dim_operation_unit;
    end if;
    SELECT to_char(sysdate-365, 'yyyy') into maxYear FROM DUAL;
      years:=maxYear - minYear + 1;
      urgent:=0;major:=0;norm:=0;total:=0;
    for i in 1 .. (maxYear - minYear + 1) loop
      v2timeRangeStart := minYear || vtimeRangeStart;
      v2timeRangeEnd   := minYear || vtimeRangeEnd;
      select f_get_defect_rate(v2timeRangeStart,
                               v2timeRangeEnd,
                               deviceClassify,
                               voltageLevel,
                               defectStatus,
                               company,
                               minYear,
                               devicePart,
                               deviceFactory,
                               defectClass,devicePlantYear,deviceType,defectLevel)
        into var_out
        from dual;
       urgent:=urgent+ var_out.urgent;
      major:=major+var_out.major;
      norm:=norm+var_out.norm;
      total:=total+var_out.total;
 
      minYear := minYear + 1;
    end loop;
    var_outt.urgent:=urgent/years;
    var_outt.major:=major/years;
    var_outt.norm:=norm/years;
    var_outt.total:=total/years;
    resultdefect.extend();
    resultdefect(resultdefect.last) := var_outt;
  end if;
  return resultdefect;
end f_get_defect_total_onerate;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值