`

oracle管道函数PIPELINED

 
阅读更多

先列举一个从网上搜到的比较简单的使用管道函数的例子:

 

--首先定义类型,管道函数可以返回多行数据,所以不能使用基础数据类型。   
create or replace type my_type as table of varchar2(4000);   
  
--创建管道函数   
--管道函数关键字: "[b]pipelined[/b]"   
--管道函数返回一行使用:"[b]pipe row(...)[/b]"   
create or replace function func_pipe_test return my_type   
  pipelined is  
begin  
  for i in reverse 1 .. 10 loop   
    pipe row(i);   
  end loop;   
  
end;   
  
--使用管道函数   
select * from table(func_pipe_test);  

 

下面结合项目中使用的与大家分享:

 

 

--首先定义类型,管道函数可以返回多行数据,所以不能使用基础数据类型
CREATE OR REPLACE TYPE "IF_SET_TAB"
 AS TABLE OF RET_ROW
--定义每一行内容的类型(此处也可定义成类似表结构)
CREATE OR REPLACE TYPE "RET_ROW"
 
   AS OBJECT(Rval  int)
--

CREATE OR REPLACE FUNCTION FB_IS_SETACCOUNT
 (
 NO   INT
 )

 RETURN  IF_SET_TAB  PIPELINED
 IS
 RET_ROW0  RET_ROW:=RET_ROW(NULL);
 bizType   fb_business.biz_type%TYPE;
 num   int;
 ret   int :=0;
 BEGIN
 SELECT  biz_type  INTO  bizType  FROM  business  WHERE   bid=FB_IS_SETACCOUNT.NO;
 IF  (bizType = '101')  THEN
    SELECT  count(*)  into  num   FROM    ACCOUNTS  WHERE   ACCOUNT_TYPE  IN('CREDIT','DEPOSIT','INTREST.INCOME','WITHHOLDING')
    AND  BID =FB_IS_SETACCOUNT.NO   and   account_no is  not  null;
    if  num = 4   then
    ret := 1;
    end if;
  ELSIF(bizType = '104')    THEN
    SELECT  count(*)  into  num  from   ACCOUNTS  WHERE   ACCOUNT_TYPE  IN('CREDIT','DEPOSIT','CONSIGN.DEPOSIT','CHARGE.PAY','CHARGE.INCOME','CONSIGN.INTREST')
      AND  BID =FB_IS_SETACCOUNT.NO  and   account_no is  not  null;
    if  num = 6   then
    ret := 1;
    end  if;
   END   IF;
   
   RET_ROW0.Rval := FB_IS_SETACCOUNT.ret; 
   pipe row(RET_ROW0);  --加入管道
   return;
 END;

 下面列举管道函数中返回的是类似于数组结构的函数:

  

  

 

--首先定义类型,管道函数可以返回多行数据,所以不能使用基础数据类型

CREATE OR REPLACE TYPE "HN_STAT_KM_BALANCE_TAB"
   AS TABLE OF HN_STAT_KM_BALANCE_ROW      
   
--定义每一行内容的类型(此处类似表结构)
CREATE OR REPLACE TYPE "HN_STAT_KM_BALANCE_ROW"                                                                                                                                                   AS OBJECT
 (no             varchar2(10),
  name            varchar2(100),
  treeNo          varchar2(20),
  currentAmount            NUMBER(20,2),
  notifyAmount     NUMBER(20,2),
  threeMonthAmount      NUMBER(20,2),
  sixMonthAmount     NUMBER(20,2),
  oneYearAmount     NUMBER(20,2),
  twoYearAmount            NUMBER(20,2),
  threeYearAmount             NUMBER(20,2),
  fiveYearAmount         NUMBER(20,2),
  MoreYearAmount          NUMBER(20,2),
  consignDepositAmount        NUMBER(20,2),
  shortLoanAmount          NUMBER(20,2),
  longLoanAmount          NUMBER(20,2),
  consignLoanAmount          NUMBER(20,2),
  totalAmount          NUMBER(20,2)
)

--下面是函数
CREATE OR REPLACE FUNCTION HN_STAT_KM_BALANCE(
qryCltno  varchar2,
qryTreeNo varchar2,
containFlag  Integer,
qrydate IN DATE,
qryType Integer,    --null--
bz IN varchar2
)
RETURN HN_STAT_KM_BALANCE_TAB PIPELINED
IS
RET  HN_STAT_KM_BALANCE_ROW:=HN_STAT_KM_BALANCE_ROW(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
anothorTreeNo varchar2(20);
qrybz varchar2(1);
BEGIN

  qrybz := bz;
  if(bz is null) then
      qrybz := 'R';
  end if; 
  --存款科目余额
  if qryType is null then
     for rec3 in(select no,treeno,name from table(HN_STAT_SHEET_CLIENT(qryCltno,qryTreeNo,containFlag,null)))
    loop
        RET := HN_STAT_KM_BALANCE_ROW(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

        ret.no := rec3.no;
        ret.treeNo := rec3.treeno;
        ret.name := rec3.name;
        ret.totalAmount := 0;
        ret.threeMonthAmount := 0;
        ret.sixMonthAmount := 0;
        ret.oneYearAmount := 0;
        ret.notifyAmount := 0;
        ret.twoYearAmount:= 0;
        ret.threeYearAmount:=0;
        ret.fiveYearAmount := 0;
        ret.MoreYearAmount := 0;
        if ret.treeNo = '001001000%' then
           anothorTreeNo := '001001';
        else
           anothorTreeNo := '000';
        end if;

        --存款统计 包括 通知,短期存款, 中长期存款
           
         for  rec in (select  sum(b.rval) amount,a.kmh  kmh  from  acnt  a,table(NS_GetRval(qrybz,a.no, qrydate, 0)) b,client n
            where    a.clientid=n.cltno  and  a.bz = qrybz  and  b.rval != 0
            and (n.treeno like ret.treeNo or n.treeno = anothorTreeNo)
            group by a.kmh  order by a.kmh)
        loop
           if (rec.kmh = '*') then
                 ret.threeMonthAmount := ret.threeMonthAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.sixMonthAmount := ret.sixMonthAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.oneYearAmount := ret.oneYearAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.notifyAmount := ret.notifyAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.twoYearAmount := ret.twoYearAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.threeYearAmount := ret.threeYearAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.fiveYearAmount := ret.fiveYearAmount + rec.amount;
           elsif(rec.kmh = '*') then
                 ret.MoreYearAmount := ret.MoreYearAmount + rec.amount;
           end if;
           
             ret.totalAmount := ret.totalAmount + rec.amount;
          
        end loop;
         PIPE ROW(RET);
    end loop;
  end if;
  RETURN;
END HN_STAT_KM_BALANCE;

 

分享到:
评论

相关推荐

    oracle管道函数用法

    ### Oracle管道函数详解 #### 一、概述 Oracle管道函数是一种特殊类型的函数,它能够返回一个数据集合,并且能够在函数执行的过程中逐步返回结果,而不仅仅是最后的结果。这种特性使得管道函数非常适合于处理大量...

    详解oracle管道函数的用法(一行拆为多行)

    如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline function)。 关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合 --创建一个集合...

    pipeline管道模型python实现

    总的来说,"pipeline管道模型python实现"涉及到的主要知识点包括:设计模式的应用、配置文件解析、Python函数或类的组合使用,以及使用`networkx`库来管理和协调这些组件。理解并熟练掌握这些概念,对于构建高效、...

    MongoDB 聚合管道(Aggregation Pipeline)

    其中,聚合管道(Aggregation Pipeline)是MongoDB中一个非常重要的特性,用于对数据进行复杂处理和分析。接下来,我们将详细地探讨MongoDB聚合管道的相关知识点。 首先,从概念上理解,MongoDB的聚合管道可以类比...

    lmd_管道泄漏_lmd_LMD仿真_仿真管道信号_pipeline_

    标题中的“lmd_管道泄漏_lmd_LMD仿真_仿真管道信号_pipeline_”指的是一个关于管道泄漏检测的项目,其中LMD(Laplacian of Gaussian,高斯拉普拉斯算子)是一种重要的仿真和分析工具。这个项目可能涉及到利用LMD方法...

    详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    本文将深入探讨如何利用Redis的管道(PipeLine)和批量(Batch)操作来显著提高数据处理速度。 首先,让我们回顾一下问题的来源。在示例代码中,为了记录商品购买用户,使用了`SADD`命令向Redis的Set中添加元素。...

    jenkins-common-pipeline:具有共享库的Jenkins通用管道

    "jenkins-common-pipeline"是一个专为Jenkins设计的项目,旨在提供一套可复用的、标准化的管道脚本,以实现高效且灵活的自动化流程。本文将深入探讨这个项目的核心概念——共享库,以及如何利用它来提升Jenkins管道...

    tomcat engine,host,context的管道处理——pipeline

    现在我们来谈谈“Pipeline”(管道)。在Tomcat中,Pipeline是一个处理链的概念,它定义了请求和响应如何在各个组件之间传递。每个Engine、Host和Context都拥有自己的Pipeline,其中包含了Valve(阀门)组件。Valve...

    EMD_管道泄漏信号_pipeline_管道_信号检测算法_EMD.zip

    标题中的“EMD_管道泄漏信号_pipeline_管道_信号检测算法_EMD.zip”表明这是一个关于使用Empirical Mode Decomposition(EMD)算法进行管道泄漏信号检测的项目。EMD是一种自适应的数据分析方法,常用于非线性、非...

    tomcat管道模式 pipeline与valve详解

    在介绍Tomcat的管道模式(Pipeline)与Valve的详细知识点前,我们先来理解一下什么是管道模式。管道模式可以被看作是一种设计模式,它的核心概念是将多个处理对象通过一种类似于管道的结构连接起来,每个处理对象在...

    EMD_管道泄漏信号_pipeline_管道_信号检测算法_EMD_源码.rar

    标题中的“EMD_管道泄漏信号_pipeline_管道_信号检测算法_EMD_源码.rar”表明这个压缩包文件主要涉及的是使用经验模态分解(Empirical Mode Decomposition, EMD)算法来检测管道泄漏的信号处理技术。EMD是一种自适应...

    Untitled_matlab_pipeline_

    标题中的“Untitled_matlab_pipeline_”暗示这可能是一个关于使用MATLAB进行管道固有频率计算的项目或脚本。MATLAB是一种强大的编程环境,尤其适用于数值计算和数据分析,因此在这个项目中,它被用来确定管道的自然...

    Pipeline管道

    用C#实现管道,用BlockingCollection 集合。线程安全

    jenkins-pipeline-docker, 带有Jenkins管道插件和 Docker的容器构建环境.zip

    jenkins-pipeline-docker, 带有Jenkins管道插件和 Docker的容器构建环境 采用Jenkins管道插件和 Docker的容器环境。这里代码与这里博客帖子相关:...

    帝国理工课件-pipeline engineering

    蓝色流管道 (Blue Stream Pipeline) - **长度**: 1213公里 - **直径**: 610-1400毫米 - **最大水深**: 2,150米 - **成本**: 32亿美元 - **输气量**: 计划到2010年达到160亿立方米 - **地震活动**: 该地区地震活跃,...

    Oracle - In Database Map-Reduce

    传统的Map-Reduce框架通常运行在独立的计算集群上,而Oracle数据库通过其独特的特性——**Pipeline Table Functions**(管道表函数)——提供了一种直接在数据库内部实现Map-Reduce的方式,从而实现了真正的“in-...

    functional-pipeline:将方法调用、属性访问和函数快速链接到管道中

    在自然的从左到右表达式中快速链接方法调用、属性访问和函数。 就像 + + 都整合到一个函数中。 Node下安装使用: npm install functional-pipeline --save var fp = require('functional-pipeline'); // or ...

Global site tag (gtag.js) - Google Analytics