笨拙而詭異的 Oracle

2022-07-14 10:06:09 字數 1551 閱讀 8086

有這樣一段 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(之二)

有一張表,很多資料 想取某個月的資料。初始的想法很簡單,根據日期 rq 形成條件即可 符合條件的記錄數是 129835,但耗時太長 14.515 秒 rq欄位是做過索引的 直觀的反應是 oracle 的 to char 函式效率不高!那有沒有其他函式呢?有,找到了乙個 months between ...

笨拙的語法

引用和指標 引用和指標引用的行為像乙個const指標解引用乙個有趣的關係式。從而給出如下 1 2 3 intnvalue 5 int constpnvalue nvalue int rnvalue nvalue pnvalue和rnvalue評估同。作為乙個結果,下面兩個語句 產生相同的效果 1 2...

笨拙的語法

123 4567 891011 1213 1415 1617 struct something member selection using actual struct variable something ssomething ssomething.nvalue 5 member selectio...