笨拙而詭異的 Oracle

來源:互聯網
上載者:User

標籤:

有這樣一段 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.