專案早期用 MySQL,隨用戶增長出現效能瓶頸,決定遷移至 Oracle。應用程式需同步修改,以下為八大關鍵差異處理:
MySQL: AUTO_INCREMENT。Oracle: 建立 Sequence,INSERT 時用 SEQ.NEXTVAL。
CREATE SEQUENCE seq_table INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE;
INSERT INTO table (id, ...) VALUES (seq_table.NEXTVAL, ...);
MySQL 支援雙引號,Oracle 僅單引號。插入/更新前必須將單引號轉義為雙單引號。
MySQL: LIMIT offset, count。Oracle 需用 ROWNUM 子查詢:
-- 寫法一
SELECT * FROM (
SELECT ROWNUM rn, t.* FROM (
SELECT * FROM table WHERE cond ORDER BY col
) t WHERE ROWNUM <= 100
) WHERE rn > 80;
-- 寫法二 (效能較佳)
SELECT * FROM (
SELECT ROWNUM rn, c.* FROM (
SELECT cols FROM table WHERE cond ORDER BY col
) c
) WHERE rn > 80 AND rn <= 100;
Oracle INSERT/UPDATE 單字節上限 4000。超過需用 CLOB + DBMS_LOB 套件。必須先做非空與長度檢查。
MySQL 有 DATE/TIME,Oracle 僅 DATE(含時分秒)。當前時間 SYSDATE。轉換函數 TO_DATE/TO_CHAR。日期運算:MySQL DATE_SUB(NOW(), INTERVAL 7 DAY),Oracle SYSDATE - 7。
MySQL NOT NULL 欄位可存空字串,Oracle NOT NULL 禁止 NULL。匯入前需將空值轉為空格字串。
LIKE 無法使用索引。改用 INSTR(col, 'str') > 0 可利用索引加速。
程序/函數結束時務必釋放結果集與游標,避免資源洩漏。