首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 SQL 表函數建立與應用實戰(二)

     編輯:DB2 教學

表函數:回傳結果集的強大工具

不同於標量函數回傳單一值,表函數接受零或多個輸入參數,回傳表格式結果集,僅能用於 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 陳述式直接回傳查詢結果

呼叫語法:TABLE() 包裝 + 相關名稱

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.

進階應用場景

  • 參數化複雜查詢封裝:將多表 JOIN、業務規則封裝為表函數,應用端簡化為單一呼叫。
  • 動態篩選推播:搭配應用層參數,實現靈活的報表資料源。
  • 安全性邊界:函數內部可實作行級安全邏輯,呼叫者無需知曉細節。
  • 效能優化: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 重用性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved