企業將應用從 Oracle 遷移至 DB2 時,SQL 方言差異是最大挑戰之一。本文針對六大高頻使用功能,提供 Oracle 與 DB2 (以 Oracle 8i / DB2 7.x 為基準) 的語法對照表與實作範例,加速遷移驗證流程。
| 平台 | 語法範例 |
|---|---|
| Oracle | |
| DB2 | |
| DB2 替代寫法 | |
重點: DB2 使用 ANSI SQL 標準 FETCH FIRST n ROWS ONLY,語意清晰;複雜排序分頁建議搭配 ROW_NUMBER() OVER(ORDER BY ...)。
| 平台 | 語法範例 |
|---|---|
| Oracle | |
| DB2 | |
補充: DB2 另提供 CURRENT DATE、CURRENT TIME 獨立取得日期/時間;sysibm.sysdummy1 為內建單列虛擬表,對應 Oracle dual。
| 平台 | 語法範例 |
|---|---|
| Oracle | |
| DB2 | |
重點: 兩平台皆支援 || 運算子與 CONCAT 函數,語法相容度極高。
| 平台 | 語法範例 |
|---|---|
| Oracle | |
| DB2 | |
注意: 原文範例誤植(Oracle/DB2 皆顯示日期查詢),此處補正為正確的結構查詢語法。
| 平台 | 語法範例 |
|---|---|
| Oracle (舊語法) | |
| DB2 / Oracle (ANSI-92) | |
建議: 統一採用 ANSI-92 INNER JOIN ... ON 語法,可移植性最高、可讀性最佳。
| 類型 | Oracle (舊語法) | DB2 / ANSI-92 標準語法 |
|---|---|---|
| 右外聯結 | WHERE a.dpt_no = b.dpt_no(+) | RIGHT OUTER JOIN ... ON a.dpt_no = b.dpt_no |
| 左外聯結 | WHERE a.dpt_no(+) = b.dpt_no | LEFT OUTER JOIN ... ON a.dpt_no = b.dpt_no |
| 全外聯結 | 不支援 (需 UNION) | FULL OUTER JOIN ... ON a.dpt_no = b.dpt_no |
關鍵差異: Oracle 舊式 (+) 標記有諸多限制(不可與 OR 併用、不可多表外聯),DB2 全面支援 ANSI-92 標準語法,功能更完整。
ROWNUM、SYSDATE、外聯結、階層查詢 (CONNECT BY) 等 Oracle 專有語法。NVL → COALESCE, DECODE → CASE, SYSDATE → CURRENT TIMESTAMP)。掌握核心語法差異是遷移成功的關鍵。建議團隊建立「SQL 遷移規範文件」,持續累積專案經驗,將遷移風險降至最低。