-- MySQL
id INT AUTO_INCREMENT PRIMARY KEY
-- Oracle
CREATE SEQUENCE seq_tbl_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE;
-- 插入時
INSERT INTO tbl (id, ...) VALUES (seq_tbl_id.NEXTVAL, ...);
-- 或建 BEFORE INSERT TRIGGER 自動填充
MySQL 支援雙引號字串,Oracle **僅支援單引號**。
插入/更新前:**所有單引號加倍**(' → '')。
MySQL:LIMIT offset, rows
Oracle 兩種高效寫法:
-- 寫法一:雙層子查詢
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM table WHERE cond ORDER BY ord
) a WHERE ROWNUM <= 100
) WHERE rn > 80;
-- 寫法二:內聯視圖
SELECT * FROM (
SELECT ROWNUM rn, c.* FROM (
SELECT * FROM table WHERE cond ORDER BY ord
) c
) WHERE rn > 80 AND rn <= 100;
-- 插入 CLOB
DECLARE
l_clob CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(:long_text), :long_text);
INSERT INTO tbl (clob_col) VALUES (l_clob);
END;
應用層預先做非空/長度校驗。
| 操作 | MySQL | Oracle |
|---|---|---|
| 當前時間 | NOW() | SYSDATE(精確到秒) |
| 字串轉日期 | STR_TO_DATE() | TO_DATE('2001-08-01','YYYY-MM-DD') |
| 日期轉字串 | DATE_FORMAT() | TO_CHAR(date,'YYYY-MM-DD HH24:MI:SS') |
| 日期運算(7天前) | date_col > SUBDATE(NOW(), INTERVAL 7 DAY) | date_col > SYSDATE - 7 |
MySQL:NOT NULL 欄可存空字串 ''。
Oracle:NOT NULL 欄**不可存空字串**(空字串視同 NULL)。
遷移時:**空字串轉為單空格 ' ' 或保留 NULL**。
-- MySQL/Oracle 通用但不走索引
WHERE col LIKE '%keyword%'
-- Oracle 專用函數,可配合 Function-Based Index
WHERE INSTR(col, 'keyword') > 0
Oracle 程序包/函數中操作完資料庫,**必須顯式關閉結果集、游標、連線**,否則洩漏導致 ORA-01000 最大開啟游標超限。
AUTO_INCREMENT 改為 Sequence + Trigger