DB2 開發與運維中,快速解讀錯誤代碼是解決問題的第一步。本文彙整 IBM DB2 常見 SQLCODE (正/負)、SQLSTATE、中文說明、觸發場景與解決方向,涵蓋警告 (01xxx)、成功 (000)、語法錯誤 (42xxx)、資源限制 (54xxx)、權限 (425xx)、資料完整性 (23xxx)、通訊 (08xxx) 等主要類別,做為桌邊速查手冊。
代碼結構速讀
- SQLCODE:正數 = 警告 (01xxx);0 = 成功;負數 = 錯誤
- SQLSTATE:5 字元標準代碼,首兩字元分類:
00 成功、01 警告、02 無資料、08 連線、22 資料異常、23 完整性違規、42 語法/存取規則、54 資源限制、55 物件不存在、56 權限、57 資源不可用、58 系統錯誤
高頻錯誤代碼分類速查表
成功與警告 (0, +01xxx)
| SQLCODE | SQLSTATE | 說明 | 常見場景/處理 |
| 0 | 00000 | 成功完成 | 正常 |
| +100 | 02000 | 無符合條件列 | 游標 FETCH 結束、單列子查詢無結果 → 檢查 WHERE 條件 |
| +117 | 01525 | 插入值個數 ≠ 表欄位數 | INSERT 明確列出欄位名,或調整 VALUES |
| +204 | 01532 | 物件未定義 | 表/視圖/索引不存在 → 檢查 Schema、權限、大小寫 |
| +206 | 01533 | 欄位不存在於指定表 | 拼寫錯誤、Schema 錯誤、欄位已刪除 |
| +304 | 01515 | 值超出宿主變數範圍 | 數值溢位、字串截斷 → 調整變數定義 |
| +402 | 01521 | 未知位置 | 主機變數參考錯誤 |
| +445 | 01004 | CAST 截斷 | 目標型別長度不足 → 擴大長度或截斷源資料 |
| +802 | 01519 | 數值溢位/除零 | 算術運算異常 → 加 CASE WHEN 分母=0 處理 |
語法與存取規則錯誤 (-42xxx, -1xx)
| SQLCODE | SQLSTATE | 說明 | 處理 |
| -007 | 42601 | 非法字元 | SQL 含不可見字元、全形符號 → 重寫 |
| -010 | 42603 | 字串常數未閉合 | 缺單引號、雙引號混用 |
| -029 | 42601 | 缺少 INTO 子句 | SELECT INTO 變數遺漏 |
| -060 | 42815 | 資料型別長度/規範無效 | VARCHAR(0)、DECIMAL(5,6) 等邏輯錯誤 |
| -084 | 42612 | 動態 SQL 無效 / OS/390 不支援 | 靜態 SQL 中用動態特性、平台差異 |
| -101 | 54001 | SQL 陳述式過長/複雜 | 拆分 SQL、使用視圖/CTE、調大 STMTHEAP |
| -103 | 42604 | 無效數值常數 | 數值格式錯誤 (如 1.2.3) |
| -104 | 42601 | 非法符號 | 關鍵字拼錯、標點誤用、保留字未加引號 |
| -107 | 42622 | 物件名過長 | 表/欄位/索引名超過 128 位元組 |
| -109 | 42601 | 視圖含 ORDER BY | 視圖定義移除 ORDER BY,改用外層查詢排序 |
| -117 | 42802 | 插入值數 ≠ 目標欄位數 | 明確列出 INSERT 欄位 |
| -119 | 42803 | HAVING/GROUP BY 欄位不符 | HAVING 引用非 GROUP BY 欄位且非聚合 |
| -121 | 42701 | INSERT/UPDATE 重複引用同欄位 | 移除重複 SET 子句 |
| -122 | 42803 | 列函數欄位未在 GROUP BY | 加入 GROUP BY 或移除列函數 |
| -125 | 42805 | ORDER BY 數字無效 | 位置數字超出 SELECT 列範圍 |
| -129 | 54004 | SQL 含超過 15 個表 | 拆分查詢、使用視圖、調大參數 |
| -130 | 22019 | ESCAPE 必須單一字元 | LIKE ... ESCAPE 'xx' → 修正為單字元 |
資料完整性與約束違規 (-23xxx, -53x, -54x)
| SQLCODE | SQLSTATE | 說明 | 處理 |
| -407 | 23502 | NOT NULL 欄位插入 NULL | 提供預設值、檢查應用邏輯 |
| -530 | 23503 | 外鍵違規 (父鍵不存在) | 先插入父表、檢查關聯資料 |
| -531 | 23504 | 父鍵被子表引用無法刪除 | 先刪子表、或設 CASCADE/SET NULL |
| -532 | 23505 | 唯一索引/主鍵重複 | 檢查業務唯一性、用 MERGE/UPSERT |
| -544 | 23522 | CHECK 約束違規 | 資料不符合定義條件 |
| -545 | 23513 | 觸發器/約束導致違規 | 檢查觸發器邏輯 |
權限與物件不存在 (-55x, -204, -206, -727)
| SQLCODE | SQLSTATE | 說明 | 處理 |
| -204 | 42704 | 物件未定義 | 建立物件、授權、確認 Schema 路徑 |
| -206 | 42703 | 欄位不存在 | 修正拼寫、ALTER TABLE ADD COLUMN |
| -551 | 42501 | 缺少物件操作權限 | GRANT SELECT/INSERT/UPDATE/DELETE/REFERENCES |
| -552 | 42502 | 缺少管理權限 | GRANT DBADM/SECADM/SYSADM |
| -727 | 56098 | 隱含物件建立失敗 (如索引) | 檢查底層錯誤 (通常是空間/權限) |
通訊與資源錯誤 (-08xxx, -9xx, -10xx, -90x, -95x)
| SQLCODE | SQLSTATE | 說明 | 處理 |
| -30081 | 08001 | 通訊錯誤/連線失敗 | 檢查主機、埠、防火牆、DB2COMM、實例狀態 |
| -30082 | 08004 | 連線被拒/安全失敗 | 認證失敗、加密不匹配、Kerberos 問題 |
| -901 | 58004 | 系統錯誤 (通常伴隨 SQLCA sqlerrmc) | 查看 db2diag.log、聯繫 IBM 支援 |
| -902 | 58005 | 系統錯誤 (嚴重) | 同上,可能需重啟實例 |
| -906 | 57019 | 資源不可用 (鎖逾時/死鎖) | 檢查鎖等待、調大 LOCKTIMEOUT、優化 SQL |
| -911 | 40001 | 死鎖/鎖逾時受害者回滾 | 統一存取順序、縮短交易、RETRY 邏輯 |
| -952 | 57011 | 處理中斷 (用戶取消/強制斷開) | 應用層處理中斷信號 |
| -964 | 57011 | 交易日誌滿 | 擴大 LOGFILSZ/LOGPRIMARY、檢查長交易、歸檔滯後 |
| -968 | 57011 | 表空間滿 | ALTER TABLESPACE ADD/EXTEND/RESIZE CONTAINER |
| -970 | 57011 | 資料庫管理器記憶體不足 | 調大 DATABASE_MEMORY、啟用 STMM |
除錯黃金三步驟
- 查 SQLCODE/SQLSTATE:應用日誌、db2diag.log、CLP 回傳
- 對照本手冊/官方文檔:確認分類與典型原因
- 定位具體 SQL 與環境:
db2pd -dynamic、db2caem、MON_GET_PKG_CACHE_STMT 找到問題陳述式、執行計劃、參數值
線上查詢資源
- IBM Knowledge Center:
db2 "? SQLCODE (CLP 內建)
- 命令列:
db2 "? SQL30081N" 顯示詳細說明
- SQLSTATE 官方定義:ISO 9075 / ANSI X3.135
將此手冊加入書籤,遇到錯誤代碼 30 秒內定位方向,讓除錯從「大海撈針」變為「順藤摸瓜」。