日期:2014-05-16  浏览次数:20396 次

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(recor