異構資料庫整合常需在 SQL Server 與 Oracle 間互查。透過 連結伺服器 可直接在 T-SQL/PL-SQL 中跨實例查詢。本文整理雙向存取的語法差異與實例。
在 Oracle 建立 Database Link 指向 SQL Server (需安裝 Oracle Gateway 或使用 Heterogeneous Services)。
語法特徵:**表名後加 @DBLink名稱**
SELECT H.FORM_KIND, H.FORM_NO
FROM FM_FORM_HEADER@TOBPM H, FM_FORM_APPROVE@TOBPM A
WHERE H.FORM_KIND = A.FORM_KIND
AND H.FORM_NO = A.FORM_NO
AND H.FORM_STATUS = 'WA'
AND A.APP_STATUS = 'U'
AND A.APP_EMP_ID = '000156'
AND H.FORM_KIND IN ('SYS.FORM.009');
TOBPM 為 Oracle 端定義的 DB Link 名稱。@TOBPM。在 SQL Server 建立 Linked Server (Provider: OraOLEDB.Oracle 或 MSDAORA)。
語法特徵:**四部分命名 LinkedServer..Schema.Table**
SELECT OU_ID, OU_CODE, LANGUAGE, OU_NAME, currency_code
FROM Oracle_ERP..APPS.CUX_BPM_OU_VL;
Oracle_ERP:Linked Server 名稱。..:目錄/資料庫名稱留空 (Oracle 無 Database 概念,通常為空)。APPS:Oracle Schema (擁有者/使用者名稱)。CUX_BPM_OU_VL:Table/View 名稱。若目前登入的 Linked Server 使用者即為該 Schema 擁有者,
Schema可省略:Oracle_ERP...CUX_BPM_OU_VL(三個點)。
OraOLEDB.Oracle。listener.ora、tnsnames.ora 加入 SQL Server 服務名。CREATE DATABASE LINK TOBPM CONNECT TO "sql_user" IDENTIFIED BY "pwd" USING 'SQLSERVER_TNS';| 建議 | 說明 |
|---|---|
| 使用 OPENQUERY | 將過濾邏輯下推至遠端執行,減少網路傳輸:SELECT * FROM OPENQUERY(Oracle_ERP, 'SELECT * FROM APPS.TBL WHERE COL = ''VAL''') |
| 避免跨伺服器 JOIN | 大量資料 JOIN 極慢,建議先將遠端資料 INSERT INTO #temp 再本地 JOIN。 |
| 資料型別對應 | Oracle NUMBER → SQL numeric/decimal,DATE → datetime,CLOB → nvarchar(max)/varbinary(max)。 |
| 分散式交易 | 跨伺服器 DML 需啟用 MSDTC,設定「啟用網路 DTC 存取」。 |
7399 / 7303:OLE DB Provider 初始化失敗 → 檢查 Oracle Client 安裝、TNS 解析、Provider 版本位元數 (32/64-bit) 是否與 SQL Server 一致。7314:OLE DB Provider 無法啟動分散式交易 → MSDTC 服務未啟動或防火牆阻擋 135/動態埠。ORA-12154:TNS 無法解析 → tnsnames.ora 設定錯誤或 Oracle Client 路徑問題。