淺談Oracle函數(shù)返回Table集合
在調(diào)用Oracle函數(shù)時(shí)為了讓PL/SQL 函數(shù)返回?cái)?shù)據(jù)的多個(gè)行,必須通過返回一個(gè) REF CURSOR 或一個(gè)數(shù)據(jù)集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數(shù)據(jù),而整個(gè)集合在可以返回前,必須進(jìn)行具體化。 9i 通過引入Oracle函數(shù)中的管道化表函數(shù)糾正了后一種情況。表函數(shù)是返回整個(gè)行的集(通常作為一個(gè)集合)的函數(shù),可以直接從 SQL 語句中進(jìn)行查詢,就好像它是一個(gè)真正的數(shù)據(jù)庫表一樣。管道化表函數(shù)與之相似,但是它像在構(gòu)建時(shí)一樣返回?cái)?shù)據(jù),而不是一次全部返回。管道化表函數(shù)更加有效,因?yàn)閿?shù)據(jù)可以盡可能快地返回。
管道化表函數(shù)必須返回一個(gè)集合。在函數(shù)中,PIPE ROW 語句被用來返回該集合的單個(gè)元素,該函數(shù)必須以一個(gè)空的 RETURN 語句結(jié)束,以表明它已經(jīng)完成。一旦我們創(chuàng)建了上述函數(shù),我們就可以使用 TABLE 操作符從 SQL 查詢中調(diào)用它,從而使Oracle函數(shù)返回Table集合。
1.使用自定義類型
- /* 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;
2.使用Pipeline管道函數(shù)和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 := (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));
以上是一個(gè)不錯(cuò)的Oracle函數(shù)返回Table集合的實(shí)例,感興趣的讀者可以試一試。