遷移核心差異與解決方案
| 類別 | MySQL | Oracle | 遷移對策 |
| 自動增長 | AUTO_INCREMENT | 無原生支援 | 建立 SEQUENCE,INSERT 時用 seq_name.NEXTVAL |
| 字串引號 | 單/雙引號皆可 | 僅單引號 | 所有雙引號改單引號;單引號內單引號雙寫 ('') |
| 分頁查詢 | LIMIT offset, count | 無 LIMIT | 使用 ROWNUM 子查詢雙層包裝 (文中提供兩種標準寫法) |
| 長字串 (>4000) | TEXT/BLOB | CLOB/BLOB | 超過 4000 字元改用 CLOB,配合 DBMS_LOB 套件操作 |
| 日期型別 | DATE/TIME/DATETIME | 僅 DATE (含時分秒) | 統一用 DATE;當前時間 SYSDATE;字串轉日期 TO_DATE;日期轉字串 TO_CHAR |
| 日期運算 | DATE_SUB(NOW(), INTERVAL 7 DAY) | SYSDATE - 7 | Oracle 日期直接加減數字代表天數 |
| 空值處理 | NOT NULL 欄位可存空字串 | NOT NULL 真正禁止 NULL | 導入前將空字串轉為單空格 ' ' 或預設值 |
| 模糊查詢 | LIKE '%str%' | 同語法但無法用索引 | 改用 INSTR(col, 'str') > 0 獲得索引支援與精確度 |
| 游標/結果集 | 自動管理 | 手動釋放 | 程序/函數結束時顯式關閉游標、釋放結果集 |
Oracle 分頁標準寫法 (兩種)
-- 寫法一:IN 子查詢
SELECT id, cols FROM table
WHERE id IN (
SELECT id FROM (
SELECT ROWNUM AS rn, id FROM table WHERE cond1 ORDER BY cond2
) WHERE rn > 80 AND rn < 100
) ORDER BY cond3;
-- 寫法二:內聯視圖
SELECT * FROM (
SELECT ROWNUM AS rn, c.* FROM (
SELECT cols FROM table WHERE cond1 ORDER BY cond2
) c
) WHERE rn > 80 AND rn < 100 ORDER BY cond3;
遷移檢查清單
- 所有
AUTO_INCREMENT → SEQUENCE + .NEXTVAL
- 雙引號 → 單引號,單引號轉義
LIMIT → ROWNUM 雙層子查詢
TEXT >4000 → CLOB + DBMS_LOB
- 日期函數/運算全面改寫
- 空字串 → 空格/預設值
LIKE '%...%' → INSTR() > 0
- 程式碼補充游標/結果集釋放邏輯
- 測試驗證:資料完整性、效能基準、應用功能回歸