MySQL → Oracle 屬異構遷移,語法、型別、函數、並發模型差異大,建議使用 Oracle SQL Developer Migration Workbench 或 AWS SCT 輔助評估轉換率。
-- MySQL
id INT AUTO_INCREMENT PRIMARY KEY
-- Oracle
CREATE SEQUENCE seq_tbl_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE NOCYCLE;
CREATE OR REPLACE TRIGGER trg_tbl_bir
BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
SELECT seq_tbl_id.NEXTVAL INTO :NEW.id FROM DUAL;
END;
12c+ 可用 GENERATED AS IDENTITY 簡化。
-- MySQL 允許雙引號
INSERT INTO t VALUES ("O'Reilly");
-- Oracle 僅單引號,單引號轉義為兩個單引號
INSERT INTO t VALUES ('O''Reilly');
-- MySQL
SELECT * FROM t LIMIT 20 OFFSET 80;
-- Oracle 寫法一 (標準)
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM t ORDER BY id
) a WHERE ROWNUM <= 100
) WHERE rn > 80;
-- Oracle 寫法二 (12c+ OFFSET/FETCH)
SELECT * FROM t ORDER BY id OFFSET 80 ROWS FETCH NEXT 20 ROWS ONLY;
-- Oracle VARCHAR2 上限 4000 bytes
-- 超過需用 CLOB
DECLARE
l_clob CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(:long_text), :long_text);
INSERT INTO t (col) VALUES (l_clob);
END;
| 操作 | MySQL | Oracle |
|---|---|---|
| 目前時間 | NOW() | SYSDATE / CURRENT_TIMESTAMP |
| 字串轉日期 | STR_TO_DATE('2024-01-15','%Y-%m-%d') | TO_DATE('2024-01-15','YYYY-MM-DD') |
| 日期轉字串 | DATE_FORMAT(dt,'%Y-%m-%d') | TO_CHAR(dt,'YYYY-MM-DD') |
| 日期運算 (7天前) | DATE_SUB(NOW(), INTERVAL 7 DAY) | SYSDATE - 7 |
| 日期格式元素 | %Y %m %d %H %i %s | YYYY MM DD HH24 MI SS |
-- MySQL
INSERT INTO t (col) VALUES (''); -- 空字串
INSERT INTO t (col) VALUES (NULL); -- NULL
-- Oracle 兩者皆視為 NULL,NOT NULL 欄位拒絕空字串
-- 遷移時需將 '' 轉為 ' ' (單空格) 或保留 NULL
-- MySQL
WHERE col LIKE '%keyword%'
-- Oracle 建議
WHERE INSTR(col, 'keyword') > 0 -- 可使用 Function-Based Index
-- 或 Oracle Text (全文索引)
Oracle 遊標資源較重,連線池洩漏極易導致 ORA-01000 maximum open cursors exceeded。
遷移是系統工程,非單純 SQL 翻譯;預留 30% 時間給測試與效能調校。