OracleParameter 型別不符導致 ORA-03111 通訊中斷錯誤

記錄在 Oracle 遇到的古怪錯誤。

Oracle Server 版本 10.2.0.4 64bit,Client 端用 Managed ODP.NET 12.1.24160719(取自 NuGet),某段程式碼誤傳 Varchar2 OracleParameter 與 DATE 欄位進行比對,預期應出現型別不符錯誤,但得到錯誤訊息為 ORA-03111 在通訊通道上收到中斷訊號(Break received on communication channel):

該資料表有其他 DATE 欄位,將 WHERE 條件換成其他 DATE 欄位,也會觸發 ORA-03111。

另一個資料表也有類似 DATE 欄位,換資料表再測,錯誤訊息變回 ORA-01861 literal does not match format string,這才是字串日期型別不符應出現的訊息。

回到問題資料表,如果不比對 DATE 欄位,改成 to_date('20121221','YYYYMMDD') = :d,則訊息變成 ORA-01861。

將 Managed ODP.NET 換成 Unmanaged ODP.NET(2.112.1.0,取自 NuGet),得到的也是 ORA-01861:

結論:由以上推測這是一個 Managed ODP.NET 的 Bug,只在特定資料表誤用 VARCHAR2 OracleParameter 比對資料表 DATE 欄位時發生,出錯時傳回 ORA-03111 通訊中斷錯誤,而非預期的 ORA-01861 日期字串轉換錯誤。

前後測試了多個資料表,只有一個資料表能重現問題,判斷屬於「人品觸發式茶包」,嚴重等級不高。但由此經驗,未來若遇到 ORA-03111 錯誤,宜留意是否為其他錯誤造成。

歡迎推文分享:
Published 22 March 2017 10:05 PM 由 Jeffrey
Filed under: ,
Views: 4,571



意見

# player said on 23 March, 2017 05:24 AM

從Orcale Selete到 SQL Server 時, 我遇過這個問題,

我的解法是在Oracle下Select命令時,  直接把有問題的欄位做 cast轉換

# Jeffrey said on 23 March, 2017 08:23 PM

to player, 可否再提供多一點細節?不是很明白 Oracle SELECT 到 SQL,是走 Linked Server?

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<March 2017>
SunMonTueWedThuFriSat
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication