標籤:
有這樣一段 SQL 代碼:
通過 C# 擷取查詢結果:
SQL 代碼中有兩個參數,且都是字串類型,以上的 C# 代碼是產生 Oracle SQL 代碼所需要的參數。運行結果如下:
居然發生這樣的錯誤!苦思冥想外加多次嘗試,均無果!
該錯誤的詭異之處在於:phdLevel 的值為 "%%" 時,運行正常,而為某一狀態值(平衡,欠平衡,過平衡) 時,運行出錯!如果說 SQL 語句有問題,將上述 SQL 語句參數代入,在 PL/SQL 中運行,一切正常!如果說是 p_phdlevel 的參數有問題,p_company 參數卻沒有任何問題!兩個參數是同樣的字串類型! 繼續苦苦思索…… p_company 參數沒有問題,那就是說,b.COMPANY = :p_company 這一條件沒有問題,也就是說,等號兩邊的資料類型是一致的!p_phdlevel 有問題,那就是說,a.PHDLEVEL LIKE :p_phdlevel 這一條件有問題,而且從錯誤資訊來看,這一條件存在著 不合理的類型轉換(unreasonable conversion)! b.COMPANY 是實體表中的一個欄位,類型為 varchar2,p_company 參數也是 varchar2(OracleDbType.Varchar2) 類型!a.PHDLVEL 不是實體表的欄位,而是 SELECT 語句產生的欄位,其類型是什嗎?p_phdlevel 參數的類型是 varchar2(OraclDbType.Varchar2)!如此看來,a.PHDLEVEL 的參數必不是 varchar2 類型!也不是 NVarchar2 類型(p_phdlevel 參數類型改成 NVarchar2 類型之後,錯誤如常)!難道是 Char 類型?將 p_phdlevel 參數類型改成 Char:
運行正常!
此時,問題雖然解決了,但並沒有消除 Oracle 的詭異:如果說 a.PHDLEVEL 的類型是 Char,導致出錯是因為 p_phdlevel 參數的類型錯誤(Varchar2) ,那為什麼在 p_phdlevel 取值為 "%%" 時運行正常,而在取值為中文("欠平衡")時卻出錯?
可能的解釋是:
條件 a.PHDLEVEL LIKE :p_phlevel 存在著一個類型轉換:將 Varchar2 類型的 p_phdlevel 參數轉換為 Char 類型,這個轉換在 p_phdlevel 取值為 "%%" 時,可以正常轉換;而當p_phdlevel 取值為中文時,則不能正常轉換! 若果如此,則更加令人匪夷所思。Char 是固定長度的字串類型,而 Varchar2 是可變長度的字串類型,二者並沒有本質區別! 笨拙而詭異的 Oracle!
笨拙而詭異的 Oracle