ITPub博客

首页 > 数据库 > Oracle > 管道函数

管道函数

原创 Oracle 作者:Sampson1 时间:2014-02-17 16:43:30 0 删除 编辑

表函数:将一个运算的结果直接输送到下一个运算中,不需要创建临时关系表来保存中间结果。表函数可以直接用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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: UTL_FILE基本用法
请登录后发表评论 登录
全部评论

注册时间:2013-04-19

  • 博文量
    7
  • 访问量
    18394