如果要通過Oracle函數實現返回表,應該如何實現呢?下面就教您一個Oracle函數返回表的實現方法,供您參考,希望對您學習Oracle函數能有所幫助。
包裡面用一個存儲過程,返回游標,就可以了
>包的定義
1) 包頭
- create or replace package mypk
- as
- type t_cursor is ref cursor;
- procedure proc(name varchar2,c out t_cursor,a number);
- end;
2) 包體
- create or replace package body mypk
- as
- procedure proc(name varchar2,c out t_cursor,a number)
- as
- begin
- open c for select * from test where id=a and namename=name;
- end proc;
- end;
這個方案的局限性太大,無法實現select * from function()的要求
從Oracle 9i 開始,提供了一個叫做“管道化表函數”的概念,來解決這個問題
這種類型的函數,必須返回一個集合類型,且標明 pipelined
這個Oracle函數不能返回具體變量,必須以一個空 return 返回
這個Oracle函數中,通過 pipe row () 語句來送出要返回的表中的每一行
調用這個Oracle函數的時候,通過 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);
如果Oracle函數帶參數,可以寫法如下:
- create or replace function fun1(i_v Int) return table_type1 pipelined as
- v1 row_type1;
- begin
- for myrow in (select k, v from tb1 Where k = i_v) loop
- v1 := row_type1(myrow.k, myrow.v);
- pipe row (v1);
- end loop;
- return;
- end;
- select * from table(fun1(100));
這個方案基本可以實現返回表的要求,但是需要注意的是,過多的集合對象的申請不利於管理。