oracle函數(shù)返回表的實(shí)現(xiàn)
如果要通過(guò)oracle函數(shù)實(shí)現(xiàn)返回表,應(yīng)該如何實(shí)現(xiàn)呢?下面就教您一個(gè)oracle函數(shù)返回表的實(shí)現(xiàn)方法,供您參考,希望對(duì)您學(xué)習(xí)oracle函數(shù)能有所幫助。
包里面用一個(gè)存儲(chǔ)過(guò)程,返回游標(biāo),就可以了
>包的定義
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;
這個(gè)方案的局限性太大,無(wú)法實(shí)現(xiàn)select * from function()的要求
從oracle 9i 開始,提供了一個(gè)叫做“管道化表函數(shù)”的概念,來(lái)解決這個(gè)問(wèn)題
這種類型的函數(shù),必須返回一個(gè)集合類型,且標(biāo)明 pipelined
這個(gè)oracle函數(shù)不能返回具體變量,必須以一個(gè)空 return 返回
這個(gè)oracle函數(shù)中,通過(guò) pipe row () 語(yǔ)句來(lái)送出要返回的表中的每一行
調(diào)用這個(gè)oracle函數(shù)的時(shí)候,通過(guò) table() 關(guān)鍵字把管道流仿真為一個(gè)數(shù)據(jù)集
以下是一個(gè)十分簡(jiǎn)單的實(shí)例:
- 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函數(shù)帶參數(shù),可以寫法如下:
- 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));
這個(gè)方案基本可以實(shí)現(xiàn)返回表的要求,但是需要注意的是,過(guò)多的集合對(duì)象的申請(qǐng)不利于管理。
【編輯推薦】
詳解Windows下卸載Oracle數(shù)據(jù)庫(kù)