首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

SQL Server Linked Server 查詢 Oracle 變長欄位元資料不一致錯誤

     編輯:Oracle 資料庫基礎

錯誤現象

SELECT * FROM OPENDATASOURCE('OraOLEDB.Oracle', 'Data Source=ORCL;User ID=scott;Password=tiger').SCOTT.TEST1
-- Msg 7356: OLE DB provider 'OraOLEDB.Oracle' supplied inconsistent metadata for a column.
-- Column 'DUMMY' (compile-time ordinal 1) reported DBTYPE 129 at compile time and 130 at run time.

根因

Oracle 無精度型別(VARCHAR2、NUMBER、DATE、LONG、CLOB)在編譯期與執行期元資料可能不一致。Oracle Bug 3117040,9.2.0.4.10 修復。

解決方案

  1. 升級 Oracle Client/Server 至 9.2.0.4.10 或更高(含 10g/11g/12c/19c)。
  2. 避免直接選取變長欄位:在 View 或衍生表中轉換為固定長度。
    -- 錯誤
    SELECT * FROM ora_tab;
    -- 正確:明確列出欄位並 CAST
    SELECT CAST(col1 AS VARCHAR2(100)), CAST(col2 AS NUMBER(10,2)) FROM ora_tab;
  3. 使用 OPENQUERY 而非四段式名稱,延遲元資料取得至執行期。
    SELECT * FROM OPENQUERY(ORA_LINK, 'SELECT col1, col2 FROM scott.test1');
  4. 建立 Oracle 端 View 固定投影,再由 SQL Server 查詢 View。

驗證元資料

-- 檢查 Oracle 端欄位型別
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE
FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'TEST1';

最佳實務

  • Linked Server 查詢 Oracle 時,永遠明確列出欄位,避免 SELECT *。
  • 數值型別指定 CAST(... AS NUMBER(p,s)),字串指定 VARCHAR2(n)。
  • 大量資料搬移優先用 SQL Server Integration Services (SSIS) + Oracle OLE DB/ODBC/Attunity 連接器,而非 Linked Server。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved