oracle数据库报无效数字?

oracle数据库报无效数字?,第1张

一般报错“无效数字”,是因为你对数值型字段,查询的时候输入了字符。可以尝试加个函数,比如 select * from table_name where to_char(column_name)='xxx' ,这样就不会报错了,不过会引起索引失效,记录数超多的(大于10万)表慎用。

在做报表系统的过程中,遇到了一个很有意思的问题,就是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进行单独处理!!

问题原因:表中的字段dept类型是varchar,但是传入的数据类型是number

解决方案两种:

①把dept字段的数据转换成number类型

builder.append("\n and to_number(s.dept) in(").append(department).append(")")

②使用presql,调用工具类的 querySqlConditionByMap() 方法,不过需要注意:

比如,有开始日期stdate 和 结束日期eddate还有 部门casein_department 时,得先把stdate和eddate从map取出来,然后再remove掉,只对casein_department进行单独处理。举例如下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10080519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存