首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

IBM DB2 新手必讀 10 大核心知識點:連線、工具、視圖、存儲過程、游標、日期陷阱與開發避坑

     編輯:DB2 教學

知識點 1:連線配置 — 客戶端配置助手

資料庫不在本機時,必須在「客戶端配置助手」建立連線:指定主機 IP、埠、資料庫別名、認證方式。命令列等效:CATALOG TCPIP NODE ...; CATALOG DB ...。

知識點 2:工具選型 — Control Center vs Quest vs PowerBuilder

  • Control Center (CC):官方免費,僅能跑 SQL,**無法直接編輯/刪除資料行**,需寫 UPDATE/DELETE。
  • Quest Central / Toad:支援儲存格編輯、複製貼上、Tab 切換,**但無法 Commit 編輯結果** (需手工跑 SQL)。
  • PowerBuilder (PB):DataWindow 模式可逐格編輯並 Commit,**但「刪除表」按鈕緊鄰「編輯資料」,誤觸即刪表且無確認提示** —— 高危操作。
  • 建議:養成**寫 SQL 修改資料**習慣,工具僅供查詢/結構瀏覽。

知識點 3:視圖不可直接 ORDER BY


-- 錯誤
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 以上)。

知識點 4:存儲過程常見限制

  • 無 TRIM(),用 LTRIM(RTRIM())。
  • INSERT 不支援表達式賦值,需先 SET var = expr 再 INSERT ... VALUES (var)。
  • 呼叫其他存儲過程,**參數不能是常數**,必須轉變數:SET p = 1; CALL proc(p);。
  • FETCH FIRST n ROWS ONLY **在存儲過程內不可用**,需改用游標。

知識點 5:函數裡不能用動態 SQL

EXECUTE IMMEDIATE / PREPARE 僅限存儲過程,UDF/SQL Function 禁止動態 SQL (SQLSTATE 38001)。

知識點 6:COMMIT/ROLLBACK 自動關閉游標

  • 無 WITH HOLD 時,Commit/Rollback 即關閉游標。
  • 需 DECLARE c CURSOR WITH HOLD FOR ... 保持跨 Commit 開啟。
  • 單獨提交 (Autocommit) 會頻繁關閉游標,**關閉 Autocommit,顯式管理事務**。

知識點 7:Proc Builder 調試痛點

  • 記憶體不足、螢幕花屏、斷點停留稍久即報 Timeout。
  • 建議:改用 db2 -td@ -vf proc.sql 部署,配合 db2 "CALL proc(...)" 手工測試,或用 IBM Data Studio 圖形化調試。

知識點 8:日期 +1 MONTH 邊界調整錯誤 (SQLSTATE 01506)


-- 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;

知識點 9:變數賦值必須用 SET + 子查詢


-- 錯誤
SELECT col INTO v_var FROM tab WHERE ...;

-- 正確
SET v_var = (SELECT col FROM tab WHERE ...);
-- 子查詢必須保證單行,否則報錯

知識點 10:完整函數範例 (含 COALESCE、多表聯查)


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 新手從「會裝會跑」進階到「懂規則、避坑、寫健壯代碼」的必經之路。建議列印貼牆,每日複習一條。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved