oracle 中的函數可以返回表類型,但,這個表類型實際上是集合類型(與數組類似).這個類型不能直接作爲 from 的賓語.
從oracle 9i 開始,提供了一個叫做“管道化表函數”的概念,來解決這個問題.這種類型的函數,必須返回一個集合類型,且標明 pipelined.這個函數不能返回具體變量,必須以一個空 return 返回.這個函數中,通過 pipe row () 語句來送出要返回的表中的每一行.調用這個函數的時候,通過 table() 關鍵字把管道流仿真爲一個數據集
以下是一個十分簡單的實例:
create table tb1(k number, v varchar2(10));
insert into tb1(k, v) values(100,'aaa');
insert into tb1(k, v) values(200,'bbb');
insert into tb1(k, v) values(200,'ccc');
select * from tb1;
create type row_type1 as object(k number, v varchar2(10));
create type table_type1 as table of row_type1;
create or replace function fun1 return table_type1 pipelined as
v row_type1;
begin
for myrow in (select k, v from tb1) loop
v := row_type1(myrow.k, myrow.v);
pipe row (v);
end loop;
return;
end;
select * from table(fun1);