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条件中就会报错。

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值