淺談Oracle函數返回Table集合

淺談Oracle函數返回Table集合  

  |字號 訂閱

在調用Oracle函數時爲了讓PL/SQL 函數返回數據的多個行,必需 通過返回一個 REF CURSOR 或一個數據聚攏 來完成。REF CURSOR 的這種情況範圍 於可以從查詢中選擇的數據,而所有聚攏 在可以返回前,必需 舉辦具體 化。 9i 通過引入Oracle函數中的管道化表函數更正了後一種情況。表函數是返回所有行的集(通常作爲一個聚攏 )的函數,可以直接從 SQL 語句中舉辦查詢,就好像 它是一個真正的數據庫表一樣。管道化表函數與之雷同,但是它像在構建時一樣返回數據,而不是一次整個 返回。管道化表函數越發 有效 , 由於 數據可以盡也許快地返回。

管道化表函數必需 返回一個聚攏 。在函數中,PIPE ROW 語句被用來返回該聚攏 的單個元素,該函數必需 以一個空的 RETURN 語句收場 ,以表明它已經完成。一旦我們創建 了上述函數,我們就可以應用 TABLE 操縱 符從 SQL 查詢中調用它,從而使Oracle函數返回Table聚攏 。

1.應用 自界說 範例

Linux系統管理
  1. /* Formatted on 2010/02/26 08:42 (Formatter Plus v4.8.8) */  
  2. CREATE OR REPLACE TYPE objemp AS OBJECT (  
  3.    maxsal   NUMBER,  
  4.    minsal   NUMBER  
  5. );  
  6. /* Formatted on 2010/02/26 08:43 (Formatter Plus v4.8.8) */  
  7. CREATE OR REPLACE TYPE tabemp AS TABLE OF objemp;  
  8.  
  9.     Linux認證

2.應用 Pipeline管道函數和Pipe row()

  1. CREATE OR REPLACE FUNCTION getmaxminsalary (department NUMBER)  
  2.    RETURN tabemp PIPELINED  
  3. AS  
  4.    maximum_salary   NUMBER;  
  5.    minimum_salary   NUMBER;  
  6.    v_errorcode      NUMBER;  
  7.    v_errortext      VARCHAR2 (200);  
  8.    v                objemp;  
  9. BEGIN  
  10.    FOR myrow IN (SELECT MAX (sal) m_sal, MIN (sal) min_sal  
  11.                    FROM emp  
  12.                   WHERE deptno = departmnet)  
  13.    LOOP  
  14.       v := objemp(myrow.m_sal, myrow.min_sal);  
  15.       PIPE ROW (v);  
  16.    END LOOP;  
  17.    RETURN;  
  18. EXCEPTION  
  19.    WHEN OTHERS  
  20.    THEN  
  21.       v_errorcode := SQLCODE;  
  22.       v_errortext := SUBSTR (SQLERRM, 1, 200);  
  23.       INSERT INTO log_table  
  24.                   (code, MESSAGE, info  
  25.                   )  
  26.            VALUES (v_errorcode, v_errortext, 'getMaxMinSalary'  
  27.                  );  
  28. END;  
  29.  

3.應用 Table操縱 符

  1. SELECT * FROM TABLE(getMaxMinSalary(10)); 

以上是一個不錯的Oracle函數返回Table聚攏 的實例,感樂趣 的讀者可以試一試。

Linux系統管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章