//概况  
//基本上,当你希望一个PLSQL(或者java或者c)程序作为数据源,而不是表,  
//你可能会用到管道函数(pipelined function).  
//pipelined function操作起来就像一张表  
//一个pl/sql函数可能会用于数据仓库的数据库里面,转换大量的数据。

 

//这可能包括格式化一系列转换数据,它们是不同的函数执行后得到的结果。  
//在oracle database 9i之前,大量的数据转换,既需要显著的内存开销,  
//又需要在转换的每个阶段将数据存储在中间表里面。在这两种情况下,  
//加载进程都会致使性能的下降。

//使用PL/SQL表函数,可以在数据转换的时候有效的减少开销。PL/SQL表函数  
//可以接收和返回多行,交付这些数据,当他们准备好的时候,而不是一次性的处理;  
//而且PL/SQL表函数还可以并行执行操作。  
--  
//实例1:生成随机数  
//你怎么样用一条sql语句生成在1-49之间的互不相同的随机数呢?  
//我们可能从一组已经生成的数中去查询(注意下面的最内层的查询);  
//任何拥有大于等于49行记录的表都可以做到。若不使用管道函数的话,下面是最好的解决办法:  
select r  
  from (select r  
           from (select rownum r  
                   from all_objects  
                  where rownum < 50)  
          order by dbms_random.value)  
where rownum <= 6;  
/  
         R  
----------  
        36  
        40  
        30  
        26  
         3  
        42  
//我们将最内部的查询叫做内嵌视图,它产生了1..49这些数,我们通过DBMS_RANDOM.VALUE,  
//来对这49个数进行排序。我们将结果集打包在另一个内嵌视图中只返回6行,  
//如果我们反复的执行这个查询,我们每次得到的6个数都会不同。  
--  
//这种问题经常出现,或许不是关于怎么生成6个随机数,而是怎么样得到N行?  
//例如,我们想要得到包括在2011-05-01和2011-05-15之间的所有日期;怎样不用"真实"表,  
//解决这个问题呢?Oracle9i/10g内置的PIPELINED function将会告诉你答案。  
//我们编写一个PL/SQL函数,它工作起来就像一个表。我们需要借助于sql的集合类型,  
//它描述了PIPELINED function返回的值。这个例子中,我们选择了一个数的表,我们创建的虚拟表,  
//它将会返回下面的数:1,2,3,...N :  
create type array  
    as table of number;  
/  
//下一步,我们创建这个PIPELINED function,它将会接收一个输入来限制返回的行数。如果没有输入,  
//这个函数将会一直长时间的生成很多行(所以,在这个查询中,一定要细心,确保使用rownum,  
//或其他的数来限制产生的行数)。  
//位于第4行的PIPELINED关键字,将会使这个函数工作起来想像一个表:  
create function  
  gen_numbers(n in number default null)  
  return array  
  PIPELINED  
  as 
  begin  
     for i in 1 .. nvl(n,999999999)  
     loop  
         pipe row(i);  
     end loop;  
     return;  
  end;  
/  
//假设我们需要3行数据,我们现在可以使用下面的其中一个查询实现:  
select * from TABLE(gen_numbers(3));  
COLUMN_VALUE  
------------  
           1  
           2  
           3  
or  
select * from TABLE(gen_numbers)  
where rownum <= 3;  
COLUMN_VALUE  
------------  
           1  
           2  
           3  
//现在我们准备去回答最开始的问题了,语句如下:  
select *  
  from (  
  select *  
    from (select * from table(gen_numbers(49)))  
  order by dbms_random.random  
  )  
where rownum <= 6  
/  
COLUMN_VALUE  
------------  
          27  
          24  
          46  
          17  
          44  
          45  
//我们可以使用这个虚拟表的功能去做很多事情,例如产生一个范围内的所有日期:  
select to_date('2011-05-01','yyyy-mm-dd')+  
        column_value-1  
  from TABLE(gen_numbers(15))  
/  
TO_DATE('2' 
-----------  
2011-05-01   
2011-05-02   
2011-05-03   
2011-05-04   
2011-05-05   
2011-05-06   
2011-05-07   
2011-05-08   
2011-05-09   
2011-05-10   
2011-05-11   
2011-05-12   
2011-05-13   
2011-05-14   
2011-05-15   
//注意上面我们使用了column_value,这是一个PIPELINED function返回的默认列的名字。  
//典型的Pipelined例子  
//当使用PL/SQL表函数时,下面是典型的步骤  
//  ·生产函数必须在其定义中使用PIPELINED关键字  
//  ·生产函数必须使用一个out参数,这个参数是一个集合,对应到返回的结果集  
//  ·一旦有结果产生,通过使用PIPE ROW关键字将其输送给消费函数  
//  ·生产函数必须以RETURN语句结束,但是不需要制定返回值  
//  ·消费函数必须使用TABLE关键字,将从PIPELINE function返回的行集当成一个常规表  
//第一步.定义一个返回的行集的格式。  
//       在这个实例中,我们返回这三个类型的值:int,date,varchar2(25)  
CREATE OR REPLACE TYPE myObjectFormat   
AS OBJECT  
(  
  A   INT,  
  B   DATE,  
  C   VARCHAR2(25)  
)  
/  
//下一步,为第一步定义的类型定义一个集合类型  
CREATE OR REPLACE TYPE myTableType  
   AS TABLE OF myObjectFormat  
/  
//最后,生产函数被打包到一个包里面,它是一个pipelined function就像被pipelined关键字所标记一样。  
CREATE OR REPLACE PACKAGE myDemoPack  
AS  
      FUNCTION prodFunc RETURN myTableType PIPELINED;  
END;  
/  
CREATE OR REPLACE PACKAGE BODY myDemoPack AS  
FUNCTION prodFunc RETURN myTableType PIPELINED IS  
BEGIN  
  FOR i in 1 .. 5  
    LOOP  
      PIPE ROW (myObjectFormat(i,SYSDATE+i,'Row '||i));  
    END LOOP;  
    RETURN;  
  END;  
END;  
/  
//测试结果:  
alter session set nls_date_format='yyyy-mm-dd';  
SELECT * FROM TABLE(myDemoPack.prodFunc());  
                A B           C  
----------------- ----------- ------------  
                1 2011-05-05  Row 1  
                2 2011-05-06  Row 2  
                3 2011-05-07  Row 3  
                4 2011-05-08  Row 4  
                5 2011-05-09  Row 5  
//结论:  
//在一个select语句里面,我们需要一个数据源,而不是一张表的话,Pipelined functions非常有用。

Oracle Pipelined Table Functions简介相关推荐

  1. oracle 管道化表函数(Pipelined Table) [转]

    http://log-cd.javaeye.com/blog/411123 关键字: oracle pipelined table 在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返 ...

  2. oracle truncate写法,Oracle Truncate Table

    oracle函数 的 Oracle Truncate Table 在本教程中,您将学习如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据(也叫截断表). Oracle ...

  3. Oracle Clustered Table

    本文主要介绍Oracle Clustered Table.Oracle集群表分为B*树索引集群表(B* tree index clustered table)和散列集群表(hash-clustered ...

  4. oracle tabs作用,Oracle 中 table 函数的应用浅析

    表函数可接受查询语句或游标作为输入参数,并可输出多行数据.该函数可以平行执行,并可持续输出数据流,被称作管道式输出.应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表. 1. 用游标传递数 ...

  5. oracle sub share pool简介以及 共享sql实现实质。

    oracle sub share pool简介以及 共享sql实现实质. 今天是2013-10-21,从上周五到现在已经三天没有研究oracle,感觉少了很多东西.现在开始继续挖掘oracle的内容 ...

  6. 关于oracle中table函数的使用

    使用oracle的table函数,查询函数返回的结果集,就如同查询普通表一样查询返回的结果集. 说明:  1.表函数可接受查询语句或游标作为输入参数,并可输出多行数据. 2.该函数可以平行执行,并可持 ...

  7. 通过案例学调优之--Oracle Cluster Table

    通过案例学调优之--Oracle Cluster Table About Clusters A cluster provides an optional method of storing table ...

  8. Oracle truncate table 与 delete tabel的区别(转)

    Oracle truncate table 与 delete tabel的区别(转) 一. 1.delete产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的rollback se ...

  9. 2场直播,本周二四丨Oracle drop table MySQL HeatWave

    1. 深入解析:Oracle drop table purge内部原理及异常恢复 - 2.2 Oracle drop table操作后,如果未开启回收站且无有效备份,信息系统面临业务数据丢失的风险.此 ...

最新文章

  1. node-vue前后端分离记录
  2. context:annotation-config/,mvc:annotation-driven/和context:component-scan之间的关系
  3. 使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表
  4. 双非计算机专业考研西安交通大学,2020双非一战计算机专硕初试403经验贴
  5. linux update语句,关于Update语句的调整(5-1)
  6. leetcode 461. 汉明距离(位运算)
  7. LeetCode 683. K 个空花盆(set/滑动窗口)
  8. 数字孪生及其在航空航天中的应用
  9. OpenVINO InferenceEngine framework
  10. Python大佬利用新接口抓取微信公众号的所有文章
  11. django 1.8 官方文档翻译: 3-6-2 内建的中间件
  12. Storm实践2-【storm实时排序TopN】 - TOP10
  13. java代码post接口请求 用 hutool工具类
  14. 人体姿态估计-CPN(三)
  15. Vagrant-文件夹共享
  16. 曾国藩:一勤天下无难事(五勤)
  17. IWDG和WWDG分析
  18. vue 文件上传下载报 文件损坏
  19. 本地windows启动redis集群
  20. 200套工作室设计行业响应式Html5模板HTML5+CSS3设计网站模板简洁设计师作品展示响应式模板整洁扁平宽屏CSS3网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机se

热门文章

  1. C++xor cipher异或密码算法(附完整源码)
  2. C++拷贝构造函数的陷阱
  3. 03_数据的特征抽取,sklearn特征抽取API,字典特征抽取DictVectorizer,文本特征抽取CountVectorizer,TF-IDF(TfidfVectorizer),详细案例
  4. override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字
  5. Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板
  6. 如何在android中设置背景,如何在Android中以编程方式设置背景可绘制
  7. Linux错误代码含义
  8. Linux内核访问外设I O资源的方式
  9. HTTP请求消息数据格式分析以及request和response
  10. 阿里云redis设置缓存方法