在 DB2 中調用使用者定義函數(UDF)與系統函數有所不同,特別是涉及表操作的函數無法直接在 SQL 陳述式中像內建函數那樣使用。掌握 VALUES 子句與虛表技巧是靈活調用函數的關鍵。
-- 直接顯示回傳值(建構單列虛表)
VALUES function_name(參數1, 參數2, ...);
-- 範例:調用 online 函數
VALUES online('user1', DATE('2009-05-05'));
將 VALUES 子句作為子查詢(衍生表)使用,必須加上別名:
SELECT * FROM (VALUES online('user1', DATE('2009-05-05'))) AS result_alias;
此寫法可直接用於 JDBC、Hibernate 等資料存取框架中調用函數並獲取結果集。
VALUES 不僅用於 INSERT,其本質是「建構一個結構化的虛擬表」:
-- 單欄多列
SELECT * FROM (VALUES 1, 2, 3) AS t(col_a);
-- 多欄多列(需括號分組)
SELECT * FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS t(id, name);
-- 指定欄位別名
SELECT * FROM (VALUES 1, 2) AS t(ok) WHERE ok = 1;
INSERT INTO log(uid, operation, logtime)
VALUES
(4, 1, CURRENT TIMESTAMP),
(4, 1, CURRENT TIMESTAMP),
(4, 0, CURRENT TIMESTAMP);
SELECT * FROM
(VALUES
(4, 1, CURRENT TIMESTAMP),
(4, 0, CURRENT TIMESTAMP)
) AS log(uid, operation, logtime);
WHERE id IN (SELECT * FROM (VALUES 1,2,3,4,5) AS t(v))MERGE INTO target USING (VALUES ...) AS src ...VALUES 子句在 FROM 子句中使用時,必須加上別名(如 AS t 或 AS t(col1, col2))DECLARE GLOBAL TEMPORARY TABLE 效能更佳| 特性 | TABLE 函數 | VALUES 包裝標量函數 |
|---|---|---|
| 回傳型態 | 直接回傳表 | 標量值 → 虛表 |
| 適用場景 | 集合運算、複雜邏輯 | 簡單標量函數、快速測試 |
| 效能 | 優化器可深度整合 | 輕量、編譯快 |
| 建立複雜度 | 需 CREATE FUNCTION | 即時使用、無需建立物件 |