企業常面臨 Oracle、SQL Server、MySQL 共存需整合。常見方案:
本文以 **Oracle 8i/9i/10g/11g/12c/19c 通用**的 **Generic Connectivity (ODBC/OLE DB)** 為例,實現 Oracle → SQL Server 實時查詢。
SQL> SELECT * FROM sys.hs_base_caps; -- 有行即安裝
若無,Universal Installer → Oracle Home → Custom → Heterogeneous Services。
控制面板 → 管理工具 → **ODBC Data Sources (64-bit)** → 系統 DSN → 新增 → **ODBC Driver 17 for SQL Server** (或 SQL Server Native Client) → 名稱:`DSN_ORA2SQL` → 服務器 IP、認證方式、默認資料庫。
HS_SQLSERVER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle_host)(PORT = 1521))
(CONNECT_DATA =
(SID = HS_SQLSERVER)
)
(HS = OK)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = HS_SQLSERVER)
(ORACLE_HOME = D:\app\oracle\product\19.0.0\dbhome_1)
(PROGRAM = hsodbc) -- OLE DB 用 hsole
(ENVS = "LD_LIBRARY_PATH=/path/to/odbc/lib") -- Linux 必須
)
)
lsnrctl reload
HS_FDS_CONNECT_INFO = DSN_ORA2SQL
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /path/to/libodbc.so -- Linux 指定 ODBC 驅動路徑
# 可選調優參數
HS_FDS_FETCH_ROWS = 100
HS_FDS_RESULTSET_SUPPORT = TRUE
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = AMERICAN_AMERICA.ZHS16GBK -- 編碼匹配
CREATE DATABASE LINK ora2sql
CONNECT TO "sql_user" IDENTIFIED BY "sql_pass"
USING 'HS_SQLSERVER';
-- 簡單查詢
SELECT * FROM sys.tables@ora2sql;
-- 業務表查詢
SELECT * FROM sales.orders@ora2sql WHERE order_date > SYSDATE - 30;
-- 跨庫 Join(Oracle 驅動)
SELECT o.order_id, c.cust_name
FROM orders@ora2sql o
JOIN customers c ON o.cust_id = c.cust_id;
-- 執行遠端預存程序 (需 Transparent Gateway 而非 Generic Connectivity)
-- BEGIN proc@ora2sql; END;
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| ORA-28500 / ORA-28511 | HS Agent 啟動失敗、DSN 不存在、驅動位數不匹配 | 檢查 listener.log、確認 64 位 Oracle 用 64 位 DSN/驅動、LD_LIBRARY_PATH |
| ORA-02019: 找不到遠端資料庫 | DB Link USING 的服務名與 tnsnames.ora 不符 | 核對 SID/服務名、tnsping 測試 |
| 中文亂碼 | NLS_LANG / HS_LANGUAGE / SQL Server 校對規則 不一致 | 統一設為 `ZHS16GBK` 或 `AL32UTF8`,HS_INIT.ORA 顯式指定 |
| 查詢極慢 | 全表掃描、無索引、Fetch Size 過小 | 遠端建索引、調大 `HS_FDS_FETCH_ROWS`、使用 `DRIVING_SITE` Hint 推算下推 |
| 分布式事務失敗 | Generic Connectivity 不支援兩階段提交 | 需購買 **Transparent Gateway for SQL Server** 才支援 XA 事務 |
| 特性 | Generic Connectivity (ODBC/OLE DB) | Transparent Gateway |
|---|---|---|
| 授權成本 | 免費(隨 Oracle 附贈) | 需額外購買 |
| 支援異構源 | 任何有 ODBC/OLE DB 驅動的庫 | 特定目標庫(SQL Server, DB2, Teradata, MySQL 等) |
| 分布式事務 (2PC) | 不支援 | 支援 |
| 效能/功能優化 | 通用,針對性弱 | 深度優化、支援目標庫特有語法/類型 |
| 適用場景 | 唯讀報表、單向同步、異構查詢 | 雙向寫入、強一致事務、核心業務跨庫 |