從安裝配置到日常開發維護,DB2 有別於其他資料庫的特性常讓開發者踩坑。本文彙總 8 個必須掌握的實戰知識點,涵蓋視圖 ORDER BY 限制、存儲過程函數差異、TRIM 缺失、動態 SQL 限制、游標自動關閉、日期月份運算陷阱、變量賦值語法、Proc Builder 調試痛點,附解決方案與代碼範例。
DB2 視圖定義中不可直接使用 ORDER BY,需包裝子查詢:
-- 錯誤
CREATE VIEW V_EMP AS SELECT * FROM EMP ORDER BY DEPT;
-- 正確
CREATE VIEW V_EMP AS
SELECT * FROM (SELECT * FROM EMP ORDER BY DEPT) AS T;
前提:需套用相關修補包(Fixpack)。
LTRIM(RTRIM(str)) 替代。-- 錯誤
INSERT INTO T VALUES (UPPER('abc'));
-- 正確
SET V = UPPER('abc');
INSERT INTO T VALUES (V);WITH HOLD 游標在 COMMIT 保持開啟,但 ROLLBACK 仍會關閉。db2 -td@ -f script.sql 命令列部署測試,或使用 Data Studio / DBeaver 替代。-- 2004-02-29 + 1 MONTH → 錯誤 SQLSTATE 01506 (日期調整)
-- 解決方案:以月首日為基準
SET V_DATE = DATE('2004-02-01') + 1 MONTH; -- 正確得到 2004-03-01
SET V_DATE = LAST_DAY(DATE('2004-02-01') + 1 MONTH); -- 得到 2004-03-31
-- 錯誤:SELECT ... INTO 在存儲過程中受限
-- 正確:
SET V_SELL_ID = (SELECT COALESCE(RECEIVE_ID, -1) FROM IS_ORDER WHERE ROW_ID = IN_ROW_ID);
SET V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE))
FROM AM_AUDIT_QUEUE A, SM_USER B, SM_USER C
WHERE A.TABLE_CODE = 'IS_ORDER'
AND A.TABLE_ROW_ID = IN_ROW_ID
AND A.AUDIT_EMP_ID = C.ROW_ID AND C.BRANCH_ID = V_BUY_ID
AND A.SUBMIT_EMP_ID = B.ROW_ID AND B.BRANCH_ID = V_SELL_ID);
UPDATE/DELETE SQL,或使用支援真正格點編輯的專業工具(如 DataGrip、DBeaver)。db2 catalog tcpip node REMOTE remote servername port 50000
db2 catalog database SAMPLE as SAMPLE at node REMOTE
db2 terminate| 知識點 | 核心限制 | 解決方案 |
|---|---|---|
| 視圖 ORDER BY | 不可直接使用 | 子查詢包裝 + 修補包 |
| 存儲過程函數 | 無 TRIM、無表達式賦值、無常量參數、無 FETCH FIRST | 變量中轉、LTRIM/RTRIM、游標邏輯 |
| UDF 動態 SQL | 禁止 | 改用存儲過程 |
| 游標行為 | COMMIT/ROLLBACK 自動關閉 | WITH HOLD、慎用單獨 COMMIT |
| 日期月份運算 | 月底日期溢位報錯 | 以月首日為基準運算 |
| 變量賦值 | SELECT INTO 受限 | SET 變量 = (子查詢) |
| 工具選擇 | 控制中心/第三方工具編輯缺陷 | 寫 SQL 或用 DataGrip/DBeaver |
內化這 8 大知識點,能讓您在 DB2 開發維護中少走彎路,專注於業務邏輯而非資料庫特性對抗。