前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle-ORA-01722 invalid number错误

Oracle-ORA-01722 invalid number错误

作者头像
Java架构师必看
发布2021-03-22 10:50:12
1.6K0
发布2021-03-22 10:50:12
举报
文章被收录于专栏:Java架构师必看

本来正常的,经过抓包才知道原来是数字型的无意中多了乱码!本来是3276的居然多了后面一串 3276P数据库

本来正常的,经过抓包才知道原来是数字型的无意中多了乱码!

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

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档