看资料说管道表函数在返回结果时不是一次性返回全部结果,因此对于某些对响应比较看重的报表程序而言比较友好。而普通表函数要在所有结果都到齐后才一次性返回结果。下面就做一个实验来验证:
首先创建一个自定义的集合类型
create type test_obj as object(id number,name varchar2(10));
用自定义的集合类型创建一个table类型
create type test_obj_table as table of test_obj;
创建两个函数,一个管道表函数 f_withpipe(),一个普通表函数f_withoutpipe();
create or replace function f_withpipe(n number)
return test_obj_table pipelined --这里用pipelined结尾,return自定义table类型
is
v_test_obj test_obj:=test_obj(null,null); --用自定义的集合类型声明一个变量,同时初始化变量
begin
for i in 1..5000000 loop
if mod(i,1000)=0 then
v_test_obj.id:=i; --给变量的属性赋值
v_test_obj.name:='aaa';
pipe row(v_test_obj); --返回这个集合的一个元素,相当于返回表的一行数据
end if;
end loop;
return; --用一个空return表示结束
end ;
create or replace function f_withoutpipe(n number)
return test_obj_table is --返回自定义的table类型
v_obj_test test_obj_table:=test_obj_table(); --用table类型声明一个变量,并初始化
begin
for i in 1..5000000 loop
if mod(i,1000)=0 then
v_obj_test.extend(1); --每次extend一行
v_obj_test(v_obj_test.last):=test_obj(i,'aaa'); --赋值,注意格式。用自定义的集合类型赋值
end if;
end loop;
return v_obj_test; --return这个变量
end ;
用plsql dev执行下边两个sql
select * from table(f_withpipe());
第一屏结果在0.127s返回
select id,name from table(f_withnopipe());
第一屏结果在3.363s返回
通过两次执行可以证明管道表函数是迭代式返回结果集,这样做的好处明显可以降低内存压力。
可以说明在某些处理结果集比较大的情形下管道表函数从请求的响应速度、降低服务器内存压力方面有比较明显的优势。
这个实验没能证明管道表函数效率要比普通表函数更高!!!