將 SQL Server (T-SQL) 資料庫遷移至 Oracle 8 (PL/SQL) 涉及資料型別對應、Identity 欄位轉換、約束條件、游標、預存程序、函數、觸發器等多層面調整。本文提供核心語法對照表與遷移策略。
| SQL Server | Oracle 8 | 備註 |
|---|---|---|
| DECIMAL[(P[,S])] | NUMBER[(P[,S])] | 精確數值 |
| NUMERIC[(P[,S])] | NUMBER[(P[,S])] | 精確數值 |
| FLOAT[(N)] | NUMBER[(N)] | 近似數值 |
| INT / SMALLINT / TINYINT | NUMBER | 整數統一對應 |
| MONEY / SMALLMONEY | NUMBER(19,4) | 貨幣型別 |
| CHAR[(N)] | CHAR[(N)] | 固定長度字串 |
| VARCHAR[(N)] | VARCHAR2[(N)] | 變動長度字串 |
| DATETIME / SMALLDATETIME | DATE | 日期時間統一對應 |
| TEXT | CLOB | 大型文字 |
| IMAGE | BLOB | 二進位大物件 |
| BIT | NUMBER(1) | 布林值對應 |
實務建議:金額欄位原用 MONEY,遷移時依精度需求調整為 NUMBER(14,2) (金額) 或 NUMBER(10,4) (單價)。
SQL Server 使用 IDENTITY(1,1) 自動遞增主鍵;Oracle 無此語法,需建立 Sequence 搭配觸發器或應用層指派。
jlbh NUMERIC(12,0) IDENTITY(1,1)
CONSTRAINT PK_tbl_example PRIMARY KEY (jlbh)
-- 1. 建立資料表
CREATE TABLE LT_AREA (
area_id NUMBER(5,0) NOT NULL,
area_name VARCHAR2(20) NOT NULL,
CONSTRAINT PK_LT_AREA PRIMARY KEY (area_id)
);
-- 2. 建立 Sequence
CREATE SEQUENCE SEQ_LT_AREA
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
-- 3. 觸發器自動填入 (可選)
CREATE OR REPLACE TRIGGER TRG_LT_AREA_BI
BEFORE INSERT ON LT_AREA
FOR EACH ROW
WHEN (NEW.area_id IS NULL)
BEGIN
SELECT SEQ_LT_AREA.NEXTVAL INTO :NEW.area_id FROM DUAL;
END;
CLUSTERED/NONCLUSTERED 索引區分OPEN/FETCH/CLOSEGETDATE() → SYSDATE、ISNULL() → NVL()、CONVERT() → TO_CHAR/TO_DATE遷移前建議先用工具產生目標 DDL,再人工微調型別與業務邏輯;大型系統分階段驗證,確保資料完整性與效能達標。