初學 IBM DB2 時,掌握核心操作差異與常見陷阱能大幅縮短學習曲線。本文整理 8 大實戰經驗,涵蓋工具選擇、SQL 語法限制、預存程序開發、日期運算、變數賦值等關鍵領域,助您少走彎路。
UPDATE/DELETE 語句。ORDER BYDB2 視圖定義不允許頂層 ORDER BY,需採用子查詢繞過:
CREATE VIEW v_example AS
SELECT * FROM (
SELECT a, b, c FROM table1 ORDER BY a
) AS sub;
註:此寫法需資料庫已套用相關修補程式。
TRIM 函數,需巢狀呼叫 LTRIM(RTRIM(str))。VALUES 子句不支援運算式,必須先賦值給變數再引用。FETCH FIRST n ROWS ONLY 在預存程序中不可用。COMMIT/ROLLBACK 會自動關閉游標,單獨提交需謹慎設計。db2 -td@ -vf script.sql 腳本部署方式驗證邏輯。對日期變數直接 +1 MONTHS 或 -1 MONTHS,若基準日為月底(如 2004-02-29),會拋出 SQLSTATE 01506(日期調整修正無效日期)。
替代方案:先取得該月第一天,再進行月份運算:
SET v_first_day = DATE(TRUNC(v_date, 'MONTH'));
SET v_next_month = v_first_day + 1 MONTHS;
SET var = (SELECT ...) 語法DB2 不支援 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);
CREATE FUNCTION SXFM.ISORDERSUBMITDATE (IN_ROW_ID DECIMAL(16,0))
RETURNS DATE
LANGUAGE SQL
BEGIN ATOMIC
DECLARE V_SUBMIT_DATE DATE;
DECLARE V_SELL_ID DECIMAL(16,0);
DECLARE V_BUY_ID DECIMAL(16,0);
SET V_SELL_ID = (SELECT COALESCE(RECEIVE_ID, -1) FROM IS_ORDER WHERE ROW_ID = IN_ROW_ID);
SET V_BUY_ID = (SELECT COALESCE(PAY_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);
RETURN V_SUBMIT_DATE;
END
DB2 在 SQL 標準相容性、工具易用性、程式開發規則上與 Oracle、SQL Server 有顯著差異。新手若能提前掌握上述 8 大要點,將在實務開發中避開大多數「隱形坑」,提升開發效率與程式碼品質。