淺談Oracle函數返回Table集合
|字號 訂閱
在調用Oracle函數時爲了讓PL/SQL 函數返回數據的多個行,必需 通過返回一個 REF CURSOR 或一個數據聚攏 來完成。REF CURSOR 的這種情況範圍 於可以從查詢中選擇的數據,而所有聚攏 在可以返回前,必需 舉辦具體 化。 9i 通過引入Oracle函數中的管道化表函數更正了後一種情況。表函數是返回所有行的集(通常作爲一個聚攏 )的函數,可以直接從 SQL 語句中舉辦查詢,就好像 它是一個真正的數據庫表一樣。管道化表函數與之雷同,但是它像在構建時一樣返回數據,而不是一次整個 返回。管道化表函數越發 有效 , 由於 數據可以盡也許快地返回。
管道化表函數必需 返回一個聚攏 。在函數中,PIPE ROW 語句被用來返回該聚攏 的單個元素,該函數必需 以一個空的 RETURN 語句收場 ,以表明它已經完成。一旦我們創建 了上述函數,我們就可以應用 TABLE 操縱 符從 SQL 查詢中調用它,從而使Oracle函數返回Table聚攏 。
1.應用 自界說 範例
Linux系統管理
- /* Formatted on 2010/02/26 08:42 (Formatter Plus v4.8.8) */
- CREATE OR REPLACE TYPE objemp AS OBJECT (
- maxsal NUMBER,
- minsal NUMBER
- );
- /* Formatted on 2010/02/26 08:43 (Formatter Plus v4.8.8) */
- CREATE OR REPLACE TYPE tabemp AS TABLE OF objemp;
- Linux認證
2.應用 Pipeline管道函數和Pipe row()
- CREATE OR REPLACE FUNCTION getmaxminsalary (department NUMBER)
- RETURN tabemp PIPELINED
- AS
- maximum_salary NUMBER;
- minimum_salary NUMBER;
- v_errorcode NUMBER;
- v_errortext VARCHAR2 (200);
- v objemp;
- BEGIN
- FOR myrow IN (SELECT MAX (sal) m_sal, MIN (sal) min_sal
- FROM emp
- WHERE deptno = departmnet)
- LOOP
- v := objemp(myrow.m_sal, myrow.min_sal);
- PIPE ROW (v);
- END LOOP;
- RETURN;
- EXCEPTION
- WHEN OTHERS
- THEN
- v_errorcode := SQLCODE;
- v_errortext := SUBSTR (SQLERRM, 1, 200);
- INSERT INTO log_table
- (code, MESSAGE, info
- )
- VALUES (v_errorcode, v_errortext, 'getMaxMinSalary'
- );
- END;
3.應用 Table操縱 符
- SELECT * FROM TABLE(getMaxMinSalary(10));
以上是一個不錯的Oracle函數返回Table聚攏 的實例,感樂趣 的讀者可以試一試。
Linux系統管理