Oracle报错ORA-01722: 无效数字排查解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle报错ORA-01722: 无效数字排查解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 在做报表系统的过程中,遇到了一个很有意思的问题,就是Oracle报了一个错 java.sql.SQLException: ORA-01722: 无效数字 ,正常来说,报该错就意味着数据类型不匹配,但是因为同一sql语句,多加了一个条件,就查出结果,不加条件,反而报错,所以就意味着,可能数据有误(或者语句有误),但是哪一条数据有误,肉眼难以识别!
有一个机构表,存10个机构, is_use=‘0’ 意味着无效,不统计, is_use=‘1’ 意味着有效,参与统计,先看sql:

这个是公共的sql部分,往后添加条件,即可查相应结果:

查昆明能查出结果,但是查云南的时候,就报错,所以一怒之下,把ynCheckSql语句结果查出来,一条一条检验,还真发现了问题:
针对德宏这一个地方,查询的时候报了 ORA-01722: 无效数字 错误,仔细查看数据源,发现数据也没什么问题,因为计算过程中,会报除数不能为0的错,而该条数据有一个值( 该值是分母,也就是除数 ),我们都知道,除数不能为0,所以Oracle针对除数为0的情况,有一个函数:

所以为了直接返回结果,除数为0时直接返回 - 如这个sql语句: ROUND(DECODE(ba.personal_plan,0,'-',(r.p5_year_inc+r.p6_year_inc+r.p7_year_inc+r.p8_year_inc+r.p9_year_inc+r.p10_year_inc)/ba.personal_plan*100),3) perPlan
我们都知道ROUND函数是保留小数位数,如果返回 - ,ROUND函数肯定会包无效数字错误,所以如果除数为0,直接返回特殊字符9999即可,后面再对9999进行单独处理!!

讨厌麻烦的ora 01722无效数字

webservice开发过程中,数据库由原来的oracle改为现在的sql server。然后重新调试,结果报出ora 01722无效数字的错误。

由于连接oracle数据库的时候并没有问题,所以一开始我以为是数据库不同,导致部分数据类型差异,(但又觉得有点离谱,切换数据库,不至于会导致这种错误吧)

经过排查,总结得出如下:

1、对于两个类型不匹配(一个数字类型,一个非数字类型,同下)的值进行赋值操作;
2、两个类型不匹配的值进行比较操作(例如,“=”);
3、to_number函数中的值,非数字的,比如,to_number(‘a‘)肯定是不行的,to_number(‘123‘)则是正常的。

 

想要避免此问题或者类似问题,必须做到:

1、对数据库数据类型了如指掌

2、在数据交换过程中,必须清楚请求,相应的数据类型

3、在复杂的sql中,需要清楚所有数据类型,逐一排查

 

结果证明我一开始的想法并没有科学依据,事实证明结论,实践巩固理论。

 

以上是关于Oracle报错ORA-01722: 无效数字排查解决方案的主要内容,如果未能解决你的问题,请参考以下文章

SQL中,使用NVL函数,报错:ora-01722:无效数字

讨厌麻烦的ora 01722无效数字

遇到的一个ORA-01722,无效数字的问题

Oracle sql 错误 ora-01722 无效数字 ora-02063 前行来自

Oracle SQL:插入失败 ORA-01722:无效数字,数据是数字而不是字符串,为啥会失败?

ORACLE-023:令人烦恼的 ora-01722 无效数字