管道函数

表函数:将一个运算的结果直接输送到下一个运算中,不需要创建临时关系表来保存中间结果。表函数可以直接用SQL语句进行查询。

Example: SELECT * FROM table(func()),使用起来好像是一个真正的数据库表,但由于在内存中,速度比表要快得多。

管道函数其实就是表函数的一种形式。

一、管道函数编写要点

1、创建一个对象类型或PL/SQL记录,为该对象类型或PL/SQL记录创建一个对应的集合类型。

2、创建返回该集合的函数。

3、使用PIPELINED结构将该函数定义为管道。

4、为PIPE ROW语句返回集合中的一个元素,主要作用于将结果返回给调用者。

5、为RETURN指定空的参数,其目的是表明函数功能完成并将控制权交给调用者。

 

二、实例

1、直接用TABLE()操作符方式输出结果集

CREATE OR REPLACE TYPE num_list IS TABLE OF NUMBER; --创建一个对象类型或PL/SQL记录

CREATE OR REPLACE FUNCTION pipe_num(p_max NUMBER)
RETURN num_list PIPELINED IS --使用PIPELINED结构将该函数定义为管道
BEGIN
  FOR i IN 0..p_max LOOP
    PIPE ROW (i*i); --为PIPE ROW语句返回集合中的一个元素,主要作用于将结果返回给调用者
  END LOOP;
  RETURN; --为RETURN指定空的参数,其目的是表明函数功能完成并将控制权交给调用者
END;

SELECT * FROM TABLE(pipe_num(5));

 

2、结果集可作为表来使用,直接和其他表相关联

3、实现实时跟踪

CREATE OR REPLACE PROCEDURE p_debug_pipe IS
BEGIN
  dbms_output.put_line('test1');
  dbms_lock.sleep(2);
  dbms_output.put_line('test2');
  dbms_lock.sleep(6);
  dbms_output.put_line('test3');
  dbms_lock.sleep(12);
  dbms_output.put_line('test4');
END;

EXEC p_debug_pipe;

输出结果:同时输出。

 

CREATE OR REPLACE TYPE output IS TABLE OF VARCHAR2(1000);
CREATE OR REPLACE FUNCTION f_debug_pipe RETURN output PIPELINED IS
BEGIN
  PIPE ROW('test1');
  dbms_lock.sleep(2);
  PIPE ROW('test2');
  dbms_lock.sleep(6);
  PIPE ROW('test3');
  dbms_lock.sleep(12);
  PIPE ROW('test4');
  RETURN;
END;

SELECT * FROM TABLE(f_debug_pipe);

输出结果:先后输出。

 

三、注意点

1、管道函数中不能使用DML,如果需要使用,则用自治函数。

2、管道函数集合的限制:允许返回对象类型、Number和Varchar2等单个数据库类型,不允许PLSQL记录类型。

3、与管道函数相关的异常NO_DATA_NEEDED

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28268054/viewspace-1082679/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28268054/viewspace-1082679/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值