`

ORACLE管道化表函数实例

阅读更多

        ORACLE 自定义函数,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。但是这种集合类型,并不能直接作为 FROM 的宾语。不过,自从 Oracle9i 之后,提供了一个叫做"管道化表函数"的概念。来解决此类问题,这种类型的函数,必须返回一个集合类型,且标明 PIPELINED。这个函数不能返回具体变量,必须以一个空的RETURN 返回。这个函数中,通过 PIPE ROW() 语句来送出要返回的表中的每一行。调用这个函数的时候,通过 TABLE() 关键字把管道流仿真为一个数据集。

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

        下面是用Pipelined Table 实现的示例:

1)创建表

create table table1
(
  id_  varchar2(45),
  name_ varchar2(45),
  update_time date,
  sys_id varchar2(45)
);

insert into table1 (ID_, NAME_, UPDATE_TIME, SYS_ID)
values ('1', 'zhangshan', to_date('01-01-2015', 'dd-mm-yyyy'), '001');

insert into table1 (ID_, NAME_, UPDATE_TIME, SYS_ID)
values ('2', 'lisi', to_date('30-01-2014', 'dd-mm-yyyy'), '002');

insert into table1 (ID_, NAME_, UPDATE_TIME, SYS_ID)
values ('3', 'wangwu', to_date('12-06-2014', 'dd-mm-yyyy'), '003');

insert into table1 (ID_, NAME_, UPDATE_TIME, SYS_ID)
values ('4', 'xiaoxiao', to_date('06-01-2015', 'dd-mm-yyyy'), '004');

insert into table1 (ID_, NAME_, UPDATE_TIME, SYS_ID)
values ('5', 'zhouchang', to_date('13-08-2014', 'dd-mm-yyyy'), '005');

2)创建包(Packages)

create or replace package my_package as
      type my_table is record(
           id_ varchar2(45),
           name_ varchar2(45),
           update_time date,
           sys_id varchar2(45)
      );
      type my_type is table of my_table;
      function get_table(time_ date) return my_type pipelined;
end my_package;

3)创建包体(Packages bodies)

create or replace package body my_package as
  function get_table(time_ date) return my_type
    pipelined is
    row_t my_table;
  begin
    for row_t in (select b.*
                    from (select id_, max(sys_id) maxsysid
                            from table1
                           where update_time < trunc(time_, 'month')
                           group by id_) a,
                         table1 b
                   where b.sys_id = a.maxsysid) loop
      pipe row(row_t);
    end loop;
    return;
  end;
end my_package;

4)PL/SQL调用此函数

select * from table(my_package.get_table(to_date('2014-12-31 10:34:12','yyyy-MM-dd hh24:mi:ss')));

        运行结果:

  • 大小: 35.1 KB
分享到:
评论

相关推荐

    在Oracle的函数中,返回表类型的语句

    在Oracle数据库中,与SQL Server不同的是,不能直接在函数中声明和返回表变量。但是,Oracle提供了类似的功能,可以通过...通过管道化表函数或普通方式,你可以根据具体需求灵活选择合适的方法来构建返回表类型的函数。

    Oracle 20071025_PLSQLTuning.pdf

    表函数和管道化表函数可以用于返回集合。这两种类型的函数在处理大量数据时非常有效,尤其是当结果集很大时。 ### 二、系统配置 除了编码实践之外,合理的系统配置也是提高 PL/SQL 性能的关键。例如,调整 Oracle ...

    创建Oracle函数的示例

    在压缩包文件"Examples-for-Creating-Oracle-Functions.pdf"中,可能包含了更多关于创建Oracle函数的实例和详细解释,包括如何使用游标、集合类型、递归以及与其他PL/SQL组件(如包、过程和触发器)的集成。...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    管道表函数允许在 PL/SQL 中创建和返回复杂的结果集,这对于处理大量数据和复杂的业务逻辑特别有用。 #### 28. 使用条件编译限制调试命令 条件编译是一种在编译时根据不同的条件选择性地包含或排除代码的方法。...

    Perl 实例精解(第三版).pdf

    第11章 模块化、打包并发送到库 11.1 包和模块 11.1.1 类比 11.1.2 定义 11.1.3 符号表 11.2 标准Perl库 11.2.1 @INC数组 11.2.2 包和.p1文件 11.2.3 模块和.pm文件 11.2.4 来自CPAN的...

    数据库经常出的面试题

    这类函数通常用于需要动态生成数据源的场景,比如在数据管道(Pipeline)和ETL过程中非常有用。 - **应用场景**:例如,在ETL过程中,可能需要根据不同的条件动态生成不同的数据集,这时`TABLE Function`就可以派...

    plsql数据库连接工具64位

    首先,PL/SQL Developer支持多种数据库连接方式,包括TCP/IP、命名管道、共享内存等,确保用户可以灵活地接入本地或远程的Oracle服务器。它内置的连接管理器允许用户保存多个数据库连接配置,便于快速切换不同的...

    wuyeguanli.rar_Piping_delphi实例_管路

    在“Piping_delphi实例_管路”这个项目中,我们可以推测开发者可能创建了一个系统来管理物业中的管路设施,包括水、气、热力等管道的维护、检查和故障报修等功能。Delphi的VCL(Visual Component Library)框架提供...

    plsql11数据库工具

    3. **对象浏览和管理**:可以查看并管理数据库中的所有对象,包括表、视图、索引、存储过程、函数、触发器等。用户可以直接在工具中创建、修改或删除这些对象。 4. **数据查看和操作**:提供了数据网格视图,允许...

    数据库,shell,测试知识

    在IT领域,数据库管理、Shell脚本编程以及测试知识是至关重要的技能,这些技术广泛应用于系统维护、自动化任务执行和软件质量保证。以下是对这些关键知识点的详细解释: ### 数据库 - Oracle Oracle数据库是全球最...

    2011百度笔试题

    - **虚函数**:通过虚函数表实现动态绑定。 - **运算符重载**:允许重定义内置运算符的行为。 #### 22. 数据库认知 - **MySQL**:开源关系型数据库管理系统,广泛应用于Web应用程序。 - **Oracle**:高性能企业级...

    PHP网络编程技术与实践 源码

    10.3 一个简单的TCP/IP服务器端和客户端实例讲解 10.4 本章小结 第11章 用户登录注册模块 11.1 数据库设计 11.2 最基本的注册模块 11.2.1 页面效果 11.2.2 代码实现 11.3 带验证码的注册模块 11.3.1 页面效果 11.3.2...

    带你读源码之MySQL连接管理1

    初始化过程中,`network_init`函数用于创建通讯端口。一旦初始化完成,服务器将开始监听,等待客户端的连接请求。这通常在`mysqld_main`主线程中通过`listen`函数实现,客户端连接请求到来时,创建`Channel_info`...

    PowerBuilder 8.0实用程序设计100例

    它以其数据窗口技术闻名,提供了图形化的用户界面(GUI)设计工具,使得开发者能够高效地创建企业级的应用系统。本资料集合“PowerBuilder 8.0实用程序设计100例”旨在通过实例教学,深入浅出地介绍如何利用Power...

    2021-2022计算机二级等级考试试题及答案No.19178.docx

    `System.Data.Oracle` 用于 Oracle 数据库 - B. `System.Data.SqlClient` 用于 SQL Server 数据库 - C. `System.Data.ODBC` 用于 ODBC 连接 - D. `System.Data.OleDB` 用于 OLE DB 连接 - **正确答案**:`B` - *...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    其他一些对数组或哈希表有用的函数包括sort(),next(),prev()和each()。 对象 使用new语句产生一个对象: class foo { function do_foo () { echo "Doing foo."; } } $bar = new foo; $bar-&gt;do_foo(); 改变变量...

    官网下载java 64位1.8版本JDK

    3. **Lambda表达式**:Lambda表达式是Java 8中的一个核心特性,它提供了一种简洁的方式来表示匿名函数,简化了处理函数接口和回调函数的代码。 4. **方法引用**:方法引用允许直接引用已有方法,而不是通过lambda...

    PowerBuilder.9.0程序设计一周通

    PowerBuilder支持多种数据库,如Oracle、MySQL、SQL Server等,理解不同数据库系统的特性也非常重要。 7. **数据源和数据管道**:数据源定义了应用程序如何连接到数据库,而数据管道则允许在不同数据源之间传输数据...

    数据库应用/PowerBuilder课件下载

    PowerBuilder支持多种数据库管理系统,如Oracle、MySQL、SQL Server等,通过ODBC或JDBC接口建立连接。开发者可以使用Database Painter工具来配置数据库连接和数据源,方便地进行数据库操作。 4. **窗口和控件** ...

Global site tag (gtag.js) - Google Analytics