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
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;
相关推荐
在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...
2. **创建Oracle函数返回索引表**: 在PL/SQL中,你可以定义一个函数,使其返回上述索引表类型。下面的`funtry_ret_index`函数创建了一个`sqlindext`类型的实例`array`,并填充了一些值,然后将其返回。 ```sql ...
对于存储过程接收或返回数组的情况,Oracle提供了可变数组类型(VARRAY)。在PL/SQL中,可以定义如`USERSEQID_ARRAY`、`USERNAME_ARRAY`和`USERPWD_ARRAY`这样的自定义数组类型。这些类型可以作为输入或输出参数在...
- **FIRST/LAST**:返回数组的第一个或最后一个元素的位置。 - **NEXT/PRIOR**:返回指定元素后或前的一个元素的位置。 - **TRIM**:移除数组尾部的空元素。 #### ASSOCIATIVE ARRAY (Indexed Table) `ASSOCIATIVE...
首先,我们需要定义一个自定义的表类型`Ns_IIS_GetPeriod_type`,它将用于存储函数返回的结果集。自定义表类型是由单个记录类型组成的数组类型,其中记录类型`Ns_IIS_GetPeriod_table`包含三个字段:描述`dscp`、...
这个函数使用了 Oracle 的管道化函数(pipelined function)来返回拆分后的结果。函数内部使用了一个循环来拆分字符串,每次循环都会将拆分后的结果返回给调用者。 最后,我们可以使用这个函数来拆分字符串。例如,...
本文将详细介绍三种在Oracle中利用函数返回对象表的方法。 首先,要返回对象表,需要先定义一个Oracle对象类型和对应的表类型。例如: ```sql CREATE OR REPLACE TYPE t_test AS OBJECT( EMPNO NUMBER(4), ENAME...
1. **类型兼容性**:确保管道函数返回的类型与定义的集合类型相匹配。 2. **资源消耗**:频繁地使用`PIPEROW`可能会导致较高的系统资源消耗。 3. **调试复杂度**:由于管道函数的特殊性,调试起来可能比普通函数更...
该函数返回 `TY_STR_SPLIT` 类型的结果集,即一个可以包含多个字符串的集合。 ```sql CREATE OR REPLACE FUNCTION fn_split(p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN ty_str_split PIPELINED IS j INT...
- 方法一:直接在PL/SQL块中调用返回数组的函数,如`aa := PKG_TCH_COURSE_INIT.Fn_GetTermDate('root', 2);`,然后通过索引访问数组元素。 - 方法二:在SQL查询中使用`INTO`子句接收返回的数组,如`Select Fn_...
oracle中没有方便分割字符串的的函数,仿照c#中的split方法和网友的方法,并进行了改进,(1)先自定义个类型str_split,(2)分割函数splitstr,返回table;(3)取第n个数组的get_splitstr,用户1,2,3部建好,使用时只需要...
根据提供的文件信息,本文将对重写Oracle中的`wm_concat`函数进行详细的解析与扩展讨论。此函数在Oracle数据库中用于连接多个字符串为一个单一的字符串。原生的`wm_concat`函数虽然能够满足基本需求,但在特定场景下...
1. **函数定义**:定义了一个名为`GET_TYPES`的函数,接受一个`VARCHAR2`类型的参数`ccs_no`,返回`VARCHAR2`类型的结果。 2. **变量声明**: - `cols_s`:用于存储所有列的定义。 - `sqls`:用于存储最终的动态...
### Oracle 分隔字符串函数知识点详解 #### 一、Oracle 分隔字符串函数介绍 在 Oracle 数据库中处理字符串是一项常见的需求,特别是在数据清洗、格式转换等场景下。Oracle 提供了一系列强大的字符串处理函数来帮助...
5. PACKAGE和PROCEDURE:PACKAGE和PROCEDURE是Oracle中的两个基本概念,分别用于定义一组相关的函数和过程,以及单个过程。 结论 本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括...
Oracle Database 12c 第2版(版本12.2)引入了一系列SQL/JSON函数,为数据库开发者提供了处理JSON数据的强大工具。这些函数允许用户直接在数据库层面上操作JSON文档,而无需在应用层面进行转换处理,极大地提高了...
1. **ABS(number)**:此函数返回给定数值的绝对值。例如,ABS(-5)将返回5。 2. **ATN(number)**:返回一个数字的反正切值。这是反三角函数的一种,常用于数学和物理计算。 3. **EXP(number)**:返回自然对数底数e...
然而,Oracle从12c版本开始提供了专门的JSON函数,如`JSON_VALUE`和`JSON_QUERY`,这些函数可以更方便地处理JSON数据,无需手动解析字符串,这在处理复杂的JSON结构时更为推荐。但是,如果你的工作环境限制了使用...
7. **数组长度**: 包含一个函数,返回数组当前包含的元素数量。`ARRAY_LENGTH(Array)`。 8. **数组拷贝**: 实现一个过程,可以复制一个数组到另一个数组,`COPY_ARRAY(DestinationArray, SourceArray)`。 9. **...