`
漂流瓶子blog
  • 浏览: 18985 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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;

 

分享到:
评论

相关推荐

    oracle_split_函数_返回数组

    在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...

    Java调用oracle函数返回oracle类(类似)集合

    2. **创建Oracle函数返回索引表**: 在PL/SQL中,你可以定义一个函数,使其返回上述索引表类型。下面的`funtry_ret_index`函数创建了一个`sqlindext`类型的实例`array`,并填充了一些值,然后将其返回。 ```sql ...

    java调用存储过程返回数组

    对于存储过程接收或返回数组的情况,Oracle提供了可变数组类型(VARRAY)。在PL/SQL中,可以定义如`USERSEQID_ARRAY`、`USERNAME_ARRAY`和`USERPWD_ARRAY`这样的自定义数组类型。这些类型可以作为输入或输出参数在...

    Oracle数组的使用

    - **FIRST/LAST**:返回数组的第一个或最后一个元素的位置。 - **NEXT/PRIOR**:返回指定元素后或前的一个元素的位置。 - **TRIM**:移除数组尾部的空元素。 #### ASSOCIATIVE ARRAY (Indexed Table) `ASSOCIATIVE...

    oracle function 返回结果集

    首先,我们需要定义一个自定义的表类型`Ns_IIS_GetPeriod_type`,它将用于存储函数返回的结果集。自定义表类型是由单个记录类型组成的数组类型,其中记录类型`Ns_IIS_GetPeriod_table`包含三个字段:描述`dscp`、...

    利用函数返回oracle对象表的三种方法

    本文将详细介绍三种在Oracle中利用函数返回对象表的方法。 首先,要返回对象表,需要先定义一个Oracle对象类型和对应的表类型。例如: ```sql CREATE OR REPLACE TYPE t_test AS OBJECT( EMPNO NUMBER(4), ENAME...

    Oracle中实现Split函数功能

    这个函数使用了 Oracle 的管道化函数(pipelined function)来返回拆分后的结果。函数内部使用了一个循环来拆分字符串,每次循环都会将拆分后的结果返回给调用者。 最后,我们可以使用这个函数来拆分字符串。例如,...

    oracle管道函数用法

    1. **类型兼容性**:确保管道函数返回的类型与定义的集合类型相匹配。 2. **资源消耗**:频繁地使用`PIPEROW`可能会导致较高的系统资源消耗。 3. **调试复杂度**:由于管道函数的特殊性,调试起来可能比普通函数更...

    oracle split函数

    该函数返回 `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...

    oracle数组定义与使用.pdf

    - 方法一:直接在PL/SQL块中调用返回数组的函数,如`aa := PKG_TCH_COURSE_INIT.Fn_GetTermDate('root', 2);`,然后通过索引访问数组元素。 - 方法二:在SQL查询中使用`INTO`子句接收返回的数组,如`Select Fn_...

    oracle字符串分割自定义函数

    oracle中没有方便分割字符串的的函数,仿照c#中的split方法和网友的方法,并进行了改进,(1)先自定义个类型str_split,(2)分割函数splitstr,返回table;(3)取第n个数组的get_splitstr,用户1,2,3部建好,使用时只需要...

    重写oracle wm_contact函数

    根据提供的文件信息,本文将对重写Oracle中的`wm_concat`函数进行详细的解析与扩展讨论。此函数在Oracle数据库中用于连接多个字符串为一个单一的字符串。原生的`wm_concat`函数虽然能够满足基本需求,但在特定场景下...

    oracle 用表结构创建 type

    1. **函数定义**:定义了一个名为`GET_TYPES`的函数,接受一个`VARCHAR2`类型的参数`ccs_no`,返回`VARCHAR2`类型的结果。 2. **变量声明**: - `cols_s`:用于存储所有列的定义。 - `sqls`:用于存储最终的动态...

    oracle分隔字符串函数

    ### Oracle 分隔字符串函数知识点详解 #### 一、Oracle 分隔字符串函数介绍 在 Oracle 数据库中处理字符串是一项常见的需求,特别是在数据清洗、格式转换等场景下。Oracle 提供了一系列强大的字符串处理函数来帮助...

    Oracle中引入的JSON函数.pdf

    Oracle Database 12c 第2版(版本12.2)引入了一系列SQL/JSON函数,为数据库开发者提供了处理JSON数据的强大工具。这些函数允许用户直接在数据库层面上操作JSON文档,而无需在应用层面进行转换处理,极大地提高了...

    oracle函数

    1. **ABS(number)**:此函数返回给定数值的绝对值。例如,ABS(-5)将返回5。 2. **ATN(number)**:返回一个数字的反正切值。这是反三角函数的一种,常用于数学和物理计算。 3. **EXP(number)**:返回自然对数底数e...

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    5. PACKAGE和PROCEDURE:PACKAGE和PROCEDURE是Oracle中的两个基本概念,分别用于定义一组相关的函数和过程,以及单个过程。 结论 本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括...

    Oracle 获取JSON字符串对象的属性值

    然而,Oracle从12c版本开始提供了专门的JSON函数,如`JSON_VALUE`和`JSON_QUERY`,这些函数可以更方便地处理JSON数据,无需手动解析字符串,这在处理复杂的JSON结构时更为推荐。但是,如果你的工作环境限制了使用...

    Mybatis传list参数调用oracle存储过程的解决方法

    这种方法可以摆脱Mybatis批量插入数据的诸多限制,例如不能实时返回主键、foreach标签循环集合长度有限制等问题,并且可以灵活地控制事务回滚。 结论 使用Mybatis传List参数调用Oracle存储过程,可以实现批量插入...

Global site tag (gtag.js) - Google Analytics