資料庫不在本機時,必須在「客戶端配置助手」建立連線:指定主機 IP、埠、資料庫別名、認證方式。命令列等效:CATALOG TCPIP NODE ...; CATALOG DB ...。
-- 錯誤
CREATE VIEW v1 AS SELECT a,b,c FROM t1 ORDER BY a;
-- 正確:巢狀查詢
CREATE VIEW v1 AS SELECT * FROM (SELECT a,b,c FROM t1 ORDER BY a) AS v;
前提:已打補丁 (V8 FP 以上)。
TRIM(),用 LTRIM(RTRIM())。INSERT 不支援表達式賦值,需先 SET var = expr 再 INSERT ... VALUES (var)。SET p = 1; CALL proc(p);。FETCH FIRST n ROWS ONLY **在存儲過程內不可用**,需改用游標。EXECUTE IMMEDIATE / PREPARE 僅限存儲過程,UDF/SQL Function 禁止動態 SQL (SQLSTATE 38001)。
WITH HOLD 時,Commit/Rollback 即關閉游標。DECLARE c CURSOR WITH HOLD FOR ... 保持跨 Commit 開啟。db2 -td@ -vf proc.sql 部署,配合 db2 "CALL proc(...)" 手工測試,或用 IBM Data Studio 圖形化調試。
-- 2004-01-31 + 1 MONTH → 2004-02-31 無效 → 自動調整為 2004-02-29 並拋 01506
-- 安全寫法:取月初再加減
SET v_first = v_date - DAY(v_date) DAYS + 1 DAY;
SET v_next_month = v_first + 1 MONTH;
-- 錯誤
SELECT col INTO v_var FROM tab WHERE ...;
-- 正確
SET v_var = (SELECT col FROM tab WHERE ...);
-- 子查詢必須保證單行,否則報錯
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
這 10 個知識點覆蓋連線、工具、視圖、存儲過程限制、動態 SQL 邊界、游標事務、調試工具、日期邊界、變數賦值、函數範例 —— 正是 DB2 新手從「會裝會跑」進階到「懂規則、避坑、寫健壯代碼」的必經之路。建議列印貼牆,每日複習一條。