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

IBM DB2 新手必讀:8 大核心知識點與開發避坑指南

     編輯:DB2 教學

從安裝配置到存儲過程開發,DB2 新手必踩的坑與鐵律

DB2 在工具易用性、SQL 方言、存儲過程語義上與 Oracle/SQL Server 差異極大。以下 8 大知識點是新手從「能跑」到「用對」的分水嶺。

1. 客戶端連線配置:不在本機必做「配置輔助程式」

  • 安裝後可用命令列 (`db2`) 或圖形介面 (`db2cc`) 操作
  • 遠端連線:必須在「客戶機配置輔助程式」建立節點/資料庫編目

2. Control Center 無法直接編輯資料

  • CC 僅支援執行 SQL,不支援網格編輯增刪改
  • 第三方工具 (Quest Toad 等) 雖支援網格編輯,但無法複製貼上、Tab 切換,體驗極差
  • **鐵律**:資料異動一律寫 `INSERT`/`UPDATE`/`DELETE` 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 tab;

需打補丁支援(V8+ 固包 APAR)

4. 存儲過程字串處理與參數傳遞陷阱

  • **無 `TRIM` 函數**:只能 `LTRIM(RTRIM(col))`
  • **INSERT 不支援表達式賦值**:`INSERT INTO t VALUES (UPPER('abc'))` ❌ → 必須先 `SET v = UPPER('abc')` 再用變數
  • **CALL 存儲過程不支援常數參數**:`CALL proc(123)` ❌ → 必須 `SET v=123; CALL proc(v)`
  • **`FETCH FIRST n ROWS ONLY` 在存儲過程中不可用**(舊版本限制)

5. 函數 (UDF) 內禁用動態 SQL

  • 存儲過程可用 `PREPARE`/`EXECUTE IMMEDIATE`
  • **標量/表函數僅支援靜態 SQL**,動態 SQL 編譯失敗

6. Commit/Rollback 自動關閉游標

  • 無 `WITH HOLD` 的游標遇 Commit/Rollback 即關閉
  • 單獨提交 (`COMMIT`) 需謹慎規劃游標生命週期

7. 日期運算邊界陷阱:閏年 2/29 + 1 MONTH 報錯

-- 2004-02-29 + 1 MONTH → 2004-03-29 (合法)
-- 但 2004-01-31 + 1 MONTH → 2004-02-31 (不存在) → SQLSTATE 01506

**替代方案**:取「當月 1 號」為基準再加減月份

SET v_first = DATE(TRUNC(current_date, 'MONTH'));
SET v_next_month = v_first + 1 MONTH;

8. 變數賦值:棄用 SELECT INTO,改用 SET 子查詢

-- 不推薦
SELECT col INTO :v FROM t WHERE ...;

-- 推薦:標量子查詢賦值 (V9.7+ 完整支援)
SET v = (SELECT col FROM t 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

DB2 嚴格、強型別、偏向標準 SQL——習慣差異是新手最大障礙,掌握這 8 點即可避開 90% 入門坑。

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