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

private final String publicSql = "SELECT r.ynccb,"+ "ROUND((r.p1_cp+r.p2_cp+r.p3_cp+r.p4_cp+NVL(t.tie_account,0)*10000)+(r.p5_cp+r.p6_cp+r.p7_cp+r.p8_cp+r.p9_cp+r.p10_cp),3) eightBen,"+ "ROUND((r.p1_year_inc+r.p2_year_inc+r.p3_year_inc+r.p4_year_inc+r.p5_year_inc+r.p6_year_inc+r.p7_year_inc+r.p8_year_inc+r.p9_year_inc+r.p10_year_inc),3) eightYear,"+ "ROUND((r.p1_month_inc+r.p2_month_inc+r.p3_month_inc+r.p4_month_inc+r.p5_month_inc+r.p6_month_inc+r.p7_month_inc+r.p8_month_inc+r.p9_month_inc+r.p10_month_inc),3) eightMonth,"+ "ROUND((r.p1_day_inc+r.p2_day_inc+r.p3_day_inc+r.p4_day_inc+r.p5_day_inc+r.p6_day_inc+r.p7_day_inc+r.p8_day_inc+r.p9_day_inc+r.p10_day_inc),3) eightDay,"+ "ROUND(DECODE(ba.plan_8add1,0,9999,(r.p1_year_inc+r.p2_year_inc+r.p3_year_inc+r.p4_year_inc+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.plan_8add1*100),3) eightPlan, "+ "ROUND(DECODE(ba.org_num,0,9999,(r.p1_year_inc+r.p2_year_inc+r.p3_year_inc+r.p4_year_inc+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.org_num),3) eightAdd,"+ "ROUND((r.p1_cp+r.p2_cp+r.p3_cp+r.p4_cp+NVL(t.tie_account,0)*10000),3) twoBen,"+ "ROUND((r.p1_year_inc+r.p2_year_inc+r.p3_year_inc+r.p4_year_inc),3) twoYear,"+ "ROUND((r.p1_month_inc+r.p2_month_inc+r.p3_month_inc+r.p4_month_inc),3) twoMonth,"+ "ROUND((r.p1_day_inc+r.p2_day_inc+r.p3_day_inc+r.p4_day_inc),3) twoDay,"+ "ROUND(DECODE(ba.plan_2add1,0,9999,((r.p1_year_inc+r.p2_year_inc+r.p3_year_inc+r.p4_year_inc)/ba.plan_2add1*100)),3) twoPlan, "+ "ROUND((r.p5_cp+r.p6_cp+r.p7_cp+r.p8_cp+r.p9_cp+r.p10_cp),3) perBen,"+ "ROUND((r.p5_year_inc+r.p6_year_inc+r.p7_year_inc+r.p8_year_inc+r.p9_year_inc+r.p10_year_inc),3) perYear,"+ "ROUND((r.p5_month_inc+r.p6_month_inc+r.p7_month_inc+r.p8_month_inc+r.p9_month_inc+r.p10_month_inc),3) perMonth,"+ "ROUND((r.p5_day_inc+r.p6_day_inc+r.p7_day_inc+r.p8_day_inc+r.p9_day_inc+r.p10_day_inc),3) perDay, "      + "ROUND(DECODE(ba.personal_plan,0,9999,(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 "   + " FROM ccb_rpt_r207 r,ccb_rpt_tie t,ccb_rpt_base ba " + " WHERE r.organ=t.ynccb_second_no AND r.organ=ba.org_no AND "+ " r.intr_date=t.intr_date AND r.intr_date='";

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

String sumHql = null ;
// 云南if(datasource.toUpperCase().equals("PV")){sumHql = publicSql + intr_date + "' and r.organ IN (" + ynCheckSql +")";}// 昆明if(datasource.toUpperCase().equals("KM")){sumHql = publicSql + intr_date + "' and r.organ in (" + kmSql + ")";}

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

decode函数,具体用法如下:
select decode(b,0,'-',a/b) from table;当b = 0时,返回-,否则返回a/b的结果。

所以为了直接返回结果,除数为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进行单独处理!!

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

  1. 【oracle报错】ORA-01722:无效数字

    ORA-01722:无效数字 场景: 周六加班,一同事在做新指标的时候,在做ORACLE那层的时候碰到了一个问题,因是在测试的时候报的错误,但并没有具体的报错信息: 不知道报错信息可以查看记录日志的表 ...

  2. 讨厌麻烦的ora 01722无效数字

    webservice开发过程中,数据库由原来的oracle改为现在的sql server.然后重新调试,结果报出ora 01722无效数字的错误. 由于连接oracle数据库的时候并没有问题,所以一开 ...

  3. Oracle报错ORA-00904: 标识符无效

    执行sql时,oracle 报错ORA-00904: 标识符无效,原因: 列名写错,表中没有那个字段: 查询语句需要加上租户名 比如:表A是 common 租户下的,用工具直接执行 select * ...

  4. oracle报错 ORA-00904: ““: 标识符无效

    oracle报错:ORA-00904: "": 标识符无效 小写字母 我的原因是建表的时候字段使用了小写, 换成大写后解决问题.

  5. Oracle 报错ORA-00904: 标识符无效 ,但是列名和表名没有写错

    1.如果使用sql建表语句进行建表 create table test(id int,name varchar2(20)) 上面这种情况没有问题. create table test("id ...

  6. oracle连接连表查询时,两表的连接字段类型不一致的时候,会导致ora 01722无效数字错误,这时候需要转换...

    类型不匹配,需要类型转换,函数:to_char()转换成字符, to_num()转换成数字 转载于:https://www.cnblogs.com/shenzhichipingguo/p/871710 ...

  7. Oracle报错:ORA-01722-无效数字

    错误原因 这种错误一般发生在向表格中插入数据的情况下,错误的原因是插入的数据中有类型不一致的. 比如:varchar类型插入到number类型中,date类型插入到number类型中,像这种类似的情况 ...

  8. 【数据库】报错ora 12154 解决方法

    Oracle报错 ora 12154 解决办法: 1.确认服务器监听正确打开: 2.确认别名前无空格.

  9. linux ora 01157,案例:Oracle报错ORA-01157 ORA-01110 数据启动报错RMAN恢复数据库思路

    天萃荷净 rman从多份备份中还原操作,运维DBA工程师反映数据库在进行恢复时报错ORA-01157 ORA-01110,分析原因为11号数据文件需要recover 1.数据恢复ORA错误 RMAN& ...

最新文章

  1. Java String关于replaceall函数转义字符的一个小贴士
  2. 一图看懂圆柱侧面与螺旋线关系,你懂了吗?
  3. 思杰20140522
  4. SSH 无法启动的原因分析及解决方法
  5. linux文件重定向用什么命令实现,Linux基础:文件描述符与重定向
  6. JDBC常用API和使用
  7. 一个由2020年1月7日 京东出现的重大 Bug 漏洞引起的思考...
  8. 微信公众号之订阅号(已认证)实现oauth2授权登录详细步骤介绍
  9. 数据分析五、Apriori 算法之关联分析
  10. ajax网页没有办法采集,Ajax网页采集方法(最新) - 八爪鱼采集器
  11. 新浪短网址生成java_T.CN短网址 新浪T.CN短网址批量生成工具推荐
  12. Analysis of Struts2 : http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html
  13. 遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
  14. 我们会是最后一批用五笔的中国人吗?
  15. 【Codecs系列】HEVC标准(五):帧间预测技术及x265实现分析
  16. mysql主从复制延迟解决
  17. 特征空间之点检测(MATLAB)
  18. java 2分钟_Java怎么判断他是否在2分钟内执行了任务?
  19. ps还原上一步快捷键_ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么...
  20. C语言公制长度转英制长度,英制换算(英制长度转换公制长度换算)

热门文章

  1. STL中便捷的bitset
  2. 北上广深租房信息分析
  3. css3宽度变大动画_SVG线条动画
  4. python自测100题,都掌握你离月薪过万不远了
  5. 阿里开发规范【转载】
  6. 分布式架构--两阶段提交和三阶段提交
  7. 受Prometheus启发的开源日志工具:Loki
  8. 格密码学Efficient Lattice (H)IBE In The Stand Model学习
  9. 抖音文案怎么写容易上热门,抖音吸引加粉点赞的句子
  10. php+Vue单页面学生管理系统