記錄在 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 錯誤,宜留意是否為其他錯誤造成。


Comments

# by player

從Orcale Selete到 SQL Server 時, 我遇過這個問題, 我的解法是在Oracle下Select命令時, 直接把有問題的欄位做 cast轉換

# by Jeffrey

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

Post a comment