關於SQL Server通過OLEDB訪問ORACLE資料表涉及Oracle11g新增欄位的錯誤提示

qdrzq發表於2014-05-20

在一個SQL SERVER從Oracle同步資料的案例中發現:
SQL Server資料庫任務中錯誤提示如下:
OLE DB 提供程式 'MSDAORA' 為列提供的後設資料不一致。執行時更改了後設資料資訊。 [SQLSTATE 42000](錯誤 7356)  OLE DB 錯誤跟蹤[Non-interface error:  Column 'STOTAL' (compile-time ordinal 6) of object '"USR01"."T_SALE"' was reported to have a DBTYPE of 131 at compile time and 130 at run time]。

查詢分析器執行語句select * from ORCL..USR01.T_SALE測試,錯誤提示如下:
伺服器: 訊息 7356,級別 16,狀態 1,行 1
OLE DB 提供程式 'MSDAORA' 為列提供的後設資料不一致。執行時更改了後設資料資訊。
OLE DB 錯誤跟蹤[Non-interface error:  Column 'STOTAL' (compile-time ordinal 6) of object '"USR01"."T_SALE"' was reported to have a DBTYPE of 131 at compile time and 130 at run time]。

考慮到Oracle資料庫使用的是11g版本,可能使用微軟MSDAORA驅動會不相容,所以,改為使用Oracle公司的驅動再進行測試.

SQL Server資料庫任務中錯誤提示如下:
OLE DB 提供程式 'OraOLEDB.Oracle' 為列提供的後設資料不一致。執行時更改了後設資料資訊。 [SQLSTATE 42000](錯誤 7356)  OLE DB 錯誤跟蹤[Non-interface error:  Column 'STOTAL' (compile-time ordinal 6) of object '"USR01"."T_SALE"' was reported to have a DBTYPE of 131 at compile time and 130 at run time]。

查詢分析器執行語句select * from ORCL..USR01.T_SALE測試,錯誤提示如下:
伺服器: 訊息 7356,級別 16,狀態 1,行 1
OLE DB 提供程式 'OraOLEDB.Oracle' 為列提供的後設資料不一致。執行時更改了後設資料資訊。
OLE DB 錯誤跟蹤[Non-interface error:  Column 'STOTAL' (compile-time ordinal 6) of object '"USR01"."T_SALE"' was reported to have a DBTYPE of 131 at compile time and 130 at run time]。


最終查明初步的原因是:
Oracle11g資料庫中,T_SALE表的STOTAL欄位不是初始建表即有的,而是後來新增的欄位.
聯想到Oracle11g能夠增強效能的一個新特性:在新增一個包含DEFAULT值的NOT NULL欄位,Oracle不會去更新現有的資料,Oracle是將預設值以及對應的表資訊、列資訊一起儲存在一個新增資料字典表ecol$中。
估計跨庫取資料欄位的資料型別受此新特性影響了.

根據本問題所做的測試來看,無論是使用Microsoft的驅動連線oracle庫,還是使用Oracle的驅動來建立連結伺服器連線oracle庫,都存在此問題.
看來正如同《基督山伯爵》中伯爵所說的:永遠不要忘記,直到上帝揭露人的未來圖景的那一天以前,人類的一切智慧就包含在這四個字裡面!"等待""希望".

目前臨時解決此問題所用的方法是:
一是將oracle新增欄位的表資料匯出,重建表,讓其建表即包含所有欄位,避免新增欄位,匯入資料;
二是在oracle庫中中建一個檢視,不包含新增的欄位,然後過程取檢視。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29512902/viewspace-1165127/,如需轉載,請註明出處,否則將追究法律責任。

相關文章