Oracle-ORA-01722 invalid number错误
本來正常的,經過抓包才知道原來是數字型的無意中多了亂碼!
本來是3276的居然多了后面一串?3276PuAnrSeU2zliU+IV/FHlnX2Xgia1au2xX2vMWtw
?
http://www.cnblogs.com/raymond19840709/archive/2008/05/16/1200826.html
1. 代碼里面執行了如下SQL語句:
? select mdn from tablename where mdn=13800000000
?? tablename表里面的mdn字段是varchar2()類型字段,由于Oracle的字段類型隱式轉換功能
?? 上面的SQL語句通常是可行的,查詢的時候oracle解析該條件時,會首先to_number(mdn)
?? 再和where mdn=13812345678進行比較判斷,如果能夠確保mdn字段里面存放的全為數字
?? 那么這個語句是一直不會報錯的(可能存在效率問題),但偏偏有人誤操作在mdn里面加入了
?? 幾個字母133aa000000,如果還是上面的語句,并且表里面沒有13800000000這個用戶的數據,
?? 當查詢掃描到133aa000000時to_number(mdn)報錯ORA-01722 invalid number
2. 因此寫SQL語句的時候最好還是規規矩矩的寫:
??? select mdn from tablename where mdn='13800000000'
?
ORA-01722 invalid number很容易理解,無須多言,一般發生在顯式的to_number()類型轉換的參數錯誤時。
前幾天我也遇到了一個由于直覺作怪而差點被忽略了的ORA-01722錯誤。
http://davidyu720.itpub.net/post/31716/291191http://davidyu720.itpub.net/post/31716/291191
一個查詢 select to_number(c.name) as srvtype, value as typename from sys_code c where c.srvclass=9 --srvclass為字符型
一直工作得很好,但突然一天返回錯誤ORA-01722 invalid number。由于條件srvclass字段是varchar2類型,就想當然地以為是ORACLE的bug(恰巧上周剛確認了ORACLE的一個查詢bug),將條件改寫成c.srvclass='9'后,查詢就又能運行了。
事情雖然過去了,可總覺得有點不對勁。首先ORACLE不可能出現這么簡單的BUG;其次就算是BUG,返回的錯誤提示也不應該是 invalid number。按理說,即使ORACLE不能自動完成類型轉換而要求寫成 srvclass='9',那么對srvclass=9這種寫法的錯誤提示也應該是invalid character。但由于直覺作怪,也就沒有深究
正好有人質疑bug的說法,我就從頭進行檢查,才發現錯誤的根本原因是:ORACLE將where c.srvclass=9解釋為where to_number(c.srvclass)=9
1)以前執行SQL時,ORACLE進行全表掃描,對每行的srvclass都轉換為number型進行比較.以前表中的srvclass的取值只有字符0到9,所以沒有出錯;
2)后來表中加入了新數據,srvclass的取值都是字母串,ORACLE進行全表掃描時,對新行上srvclass的to_number轉換當然就返回ORA-01722 invalid number了。
附:我也拜讀了yangtingkun的關于ORA-01722錯誤的帖子http://yangtingkun.itpub.net/post/468/237197,介紹了一種錯誤情形:將函數調用放到SELECT列表中可以執行,如果放到WHERE條件中就會報錯。
?
總結
以上是生活随笔為你收集整理的Oracle-ORA-01722 invalid number错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近手机彩铃是什么歌啊
- 下一篇: form表单的reset