程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle函數返回表的實現

oracle函數返回表的實現

編輯:Oracle數據庫基礎

如果要通過Oracle函數實現返回表,應該如何實現呢?下面就教您一個Oracle函數返回表的實現方法,供您參考,希望對您學習Oracle函數能有所幫助。

包裡面用一個存儲過程,返回游標,就可以了

>包的定義
1) 包頭

  1. create or replace package mypk  
  2. as  
  3. type t_cursor is ref cursor;  
  4. procedure proc(name varchar2,c out t_cursor,a number);  
  5. end; 

2) 包體

  1. create or replace package body mypk  
  2. as  
  3. procedure proc(name varchar2,c out t_cursor,a number)  
  4. as   
  5. begin  
  6. open c for select * from test where id=a and namename=name;  
  7. end proc;  
  8. end;  

這個方案的局限性太大,無法實現select * from function()的要求

從Oracle 9i 開始,提供了一個叫做“管道化表函數”的概念,來解決這個問題
這種類型的函數,必須返回一個集合類型,且標明 pipelined
這個Oracle函數不能返回具體變量,必須以一個空 return 返回
這個Oracle函數中,通過 pipe row () 語句來送出要返回的表中的每一行

調用這個Oracle函數的時候,通過 table() 關鍵字把管道流仿真為一個數據集

以下是一個十分簡單的實例:

  1. create table tb1(k number, v varchar2(10));  
  2.  
  3. insert into tb1(k, v) values(100,'aaa');  
  4. insert into tb1(k, v) values(200,'bbb');  
  5. insert into tb1(k, v) values(200,'ccc');  
  6.  
  7. select * from tb1;  
  8.  
  9. create type row_type1 as object(k number, v varchar2(10));  
  10.  
  11. create type table_type1 as table of row_type1;  
  12.  
  13. create or replace function fun1 return table_type1 pipelined as  
  14. v row_type1;  
  15. begin  
  16. for myrow in (select k, v from tb1) loop  
  17. :row_type1(myrow.k, myrow.v);  
  18. pipe row (v);  
  19. end loop;  
  20. return;  
  21. end;  
  22.  
  23. select * from table(fun1);  
  24.  

如果Oracle函數帶參數,可以寫法如下:

  1. create or replace function fun1(i_v Int) return table_type1 pipelined as  
  2. v1 row_type1;  
  3. begin  
  4. for myrow in (select k, v from tb1 Where k = i_v) loop  
  5. v1 :row_type1(myrow.k, myrow.v);  
  6. pipe row (v1);  
  7. end loop;  
  8. return;  
  9. end;  
  10.  
  11. select * from table(fun1(100));  

這個方案基本可以實現返回表的要求,但是需要注意的是,過多的集合對象的申請不利於管理。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved