表函数:将一个运算的结果直接输送到下一个运算中,不需要创建临时关系表来保存中间结果。表函数可以直接用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/