不同於標量函數回傳單一值,表函數接受零或多個輸入參數,回傳表格式結果集,僅能用於 SQL 陳述式的 FROM 子句中。
CREATE FUNCTION jobemployees (job VARCHAR(8))
RETURNS TABLE (
empno CHAR(6),
firstname VARCHAR(12),
lastname VARCHAR(15)
)
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN
SELECT empno, firstnme, lastname
FROM employee
WHERE employee.job = jobemployees.job;
| 子句 | 含義 |
|---|---|
RETURNS TABLE (...) | 定義回傳結果集的欄位名稱與型別 |
LANGUAGE SQL | 函數主體為 SQL 語句(非外部 C/Java) |
READS SQL DATA | 宣告函數讀取資料,不修改資料(優化器參考) |
NO EXTERNAL ACTION | 無外部副作用(如寫檔、網路呼叫),利於並行優化 |
DETERMINISTIC | 相同輸入必定產生相同輸出,優化器可快取結果 |
RETURN SELECT ... | 單一 RETURN 陳述式直接回傳查詢結果 |
SELECT *
FROM TABLE(jobemployees('CLERK')) AS clerk;
TABLE() 包裝函數呼叫。AS clerk),即使不引用也需語法合法。'CLERK' 傳入 job 變數,內部查詢以 jobemployees.job 參考。EMPNO FIRSTNAME LASTNAME
------ ---------- ---------------
000120 SEAN O'CONNELL
000230 JAMES JEFFERSON
000240 SALVATORE MARINO
000250 DANIEL SMITH
000260 SYBIL JOHNSON
000270 MARIA PEREZ
6 record(s) selected.
DETERMINISTIC + NO EXTERNAL ACTION 允許優化器在查詢轉換時內聯或快取結果。| 特性 | 標量函數 | 表函數 |
|---|---|---|
| 回傳型別 | 單一值 | 結果集 (0~N 列) |
| 使用位置 | SELECT 清單、WHERE、VALUES 等 | 僅 FROM 子句 |
| 呼叫語法 | func(arg) | TABLE(func(arg)) AS alias |
| 典型用途 | 計算、轉換、格式化 | 資料集封裝、參數化視圖 |
RETURNS TABLE 定義完全一致。PIPELINED 函數(DB2 9.7+ 支援)以串流方式產生結果,減少記憶體壓力。TF_ 或 UDTF_ 區分標量函數。表函數是 DB2 SQL PL 中實現「參數化視圖」與業務邏輯封裝的核心機制,善用之可大幅提升 SQL 重用性與維護性。