在 DB2 實際開發運維中,有許多「坑」不在文檔顯眼處,只能靠踩過才知道。本文整理 8 個必須掌握的實戰知識點。
資料庫服務端不在本機時,必須在「客戶機配置輔助程序」建立節點目錄與數據庫目錄,才能遠程連接。
DB2 視圖定義不允許頂層 ORDER BY,繞過寫法:
CREATE VIEW v_sorted AS
SELECT * FROM (
SELECT a, b, c FROM table1 ORDER BY a
) AS t;
前提:需打上相應 Fixpack(早期版本有此限制,新版已放寬)。
LTRIM(RTRIM(str)) 去除兩端空格。INSERT INTO t VALUES (UPPER('abc')) 報錯,必須先賦值給變量再插入。CALL proc(10) 報錯,必須 SET v=10; CALL proc(v);。FETCH FIRST n ROWS ONLY 在存儲過程中不可用**(早期版本限制)。存儲過程可用 PREPARE/EXECUTE 執行動態 SQL,**但標量/表函數完全禁止動態 SQL**,違規會編譯報錯。
DB2 預設 COMMIT 或 ROLLBACK 會關閉所有打開的游標(`WITH HOLD` 除外)。長事務中使用游標需謹慎規劃提交點,或聲明 `WITH HOLD`。
date_var + 1 MONTH 若遇 2004-02-29 會拋 SQLSTATE 01506(日期調整導致無效日期)。
替代方案:取當月第一天再加減月份:(date_var - DAY(date_var) DAYS + 1 DAYS) + 1 MONTH。
不支援 SELECT ... INTO var,必須寫:
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 ...);
子查詢必須保證**單行單列**返回,否則報錯。
這 8 點涵蓋連接、工具、視圖、存儲過程字符串/參數/動態 SQL 限制、游標行為、日期邊界、賦值語法,**是 DB2 開發從「能跑」到「穩健」的分水嶺**。建議收藏備查,代碼評審時作為檢查清單。