DB2 內建函數雖豐富,但無法涵蓋所有業務邏輯。SQL 標量 UDF允許開發者以 SQL 撰寫可重用的計算邏輯,並像內建函數一樣在 SQL 陳述式中任意位置呼叫(SELECT 清單、WHERE、VALUES、SET 等)。
CREATE FUNCTION ca (r DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN 3.14159 * (r * r);
| 子句 | 語義 | 優化影響 |
|---|---|---|
LANGUAGE SQL | 函數主體為 SQL(對比 EXTERNAL C/Java) | 資料庫內部執行,無進程切換開銷 |
CONTAINS SQL | 函數內含 SQL 讀寫(對比 READS/ MODIFIES/ NO SQL) | 此處僅計算,實際可用 NO SQL 更精確 |
NO EXTERNAL ACTION | 無外部副作用(檔案、網路、系統呼叫) | 允許並行執行、結果快取、查詢重寫 |
DETERMINISTIC | 相同輸入必得相同輸出 | 優化器可常數摺疊、結果快取、索引擴展 |
SELECT ca(96.8) AS area
FROM sysibm.sysdummy1;
SYSIBM.SYSDUMMY1 為單列編目視圖,常作為無表來源查詢的標準靶表。
AREA
------------------------
+2.94374522816000E+004
1 record(s) selected.
| 維度 | 標量函數 | 表函數 |
|---|---|---|
| 回傳 | 單一值 | 結果集 (表) |
| 使用處 | 運算式可出現處 | 僅 FROM 子句 |
| 呼叫語法 | func(arg) | TABLE(func(arg)) AS alias |
| 建立關鍵字 | RETURNS <type> | RETURNS TABLE (...) |
MATH_, STR_, BIZ_)區分功能領域。NO SQL + DETERMINISTIC + NO EXTERNAL ACTION 組合,獲最大優化空間。r * r * 3.14)直接寫在查詢中更清晰;UDF 適用於跨系統重用的業務規則(如稅率計算、編碼轉換、狀態機邏輯)。MON_GET_ROUTINE 統計。LANGUAGE C / JAVA 實現 SQL 無法表達的複雜演算法(加密、圖像處理、機器學習推論)。AGGREGATE 函數(如中位數、百分位數)。掌握 SQL 標量 UDF 開發,是將業務邏輯下沉至資料庫層、實現「粗粒度服務、細粒度重用」架構的關鍵技能。