Oracle报错ORA-01722: 无效数字排查解决方案
在做报表系统的过程中,遇到了一个很有意思的问题,就是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: 无效数字排查解决方案相关推荐
- 【oracle报错】ORA-01722:无效数字
ORA-01722:无效数字 场景: 周六加班,一同事在做新指标的时候,在做ORACLE那层的时候碰到了一个问题,因是在测试的时候报的错误,但并没有具体的报错信息: 不知道报错信息可以查看记录日志的表 ...
- 讨厌麻烦的ora 01722无效数字
webservice开发过程中,数据库由原来的oracle改为现在的sql server.然后重新调试,结果报出ora 01722无效数字的错误. 由于连接oracle数据库的时候并没有问题,所以一开 ...
- Oracle报错ORA-00904: 标识符无效
执行sql时,oracle 报错ORA-00904: 标识符无效,原因: 列名写错,表中没有那个字段: 查询语句需要加上租户名 比如:表A是 common 租户下的,用工具直接执行 select * ...
- oracle报错 ORA-00904: ““: 标识符无效
oracle报错:ORA-00904: "": 标识符无效 小写字母 我的原因是建表的时候字段使用了小写, 换成大写后解决问题.
- Oracle 报错ORA-00904: 标识符无效 ,但是列名和表名没有写错
1.如果使用sql建表语句进行建表 create table test(id int,name varchar2(20)) 上面这种情况没有问题. create table test("id ...
- oracle连接连表查询时,两表的连接字段类型不一致的时候,会导致ora 01722无效数字错误,这时候需要转换...
类型不匹配,需要类型转换,函数:to_char()转换成字符, to_num()转换成数字 转载于:https://www.cnblogs.com/shenzhichipingguo/p/871710 ...
- Oracle报错:ORA-01722-无效数字
错误原因 这种错误一般发生在向表格中插入数据的情况下,错误的原因是插入的数据中有类型不一致的. 比如:varchar类型插入到number类型中,date类型插入到number类型中,像这种类似的情况 ...
- 【数据库】报错ora 12154 解决方法
Oracle报错 ora 12154 解决办法: 1.确认服务器监听正确打开: 2.确认别名前无空格.
- linux ora 01157,案例:Oracle报错ORA-01157 ORA-01110 数据启动报错RMAN恢复数据库思路
天萃荷净 rman从多份备份中还原操作,运维DBA工程师反映数据库在进行恢复时报错ORA-01157 ORA-01110,分析原因为11号数据文件需要recover 1.数据恢复ORA错误 RMAN& ...
最新文章
- Java String关于replaceall函数转义字符的一个小贴士
- 一图看懂圆柱侧面与螺旋线关系,你懂了吗?
- 思杰20140522
- SSH 无法启动的原因分析及解决方法
- linux文件重定向用什么命令实现,Linux基础:文件描述符与重定向
- JDBC常用API和使用
- 一个由2020年1月7日 京东出现的重大 Bug 漏洞引起的思考...
- 微信公众号之订阅号(已认证)实现oauth2授权登录详细步骤介绍
- 数据分析五、Apriori 算法之关联分析
- ajax网页没有办法采集,Ajax网页采集方法(最新) - 八爪鱼采集器
- 新浪短网址生成java_T.CN短网址 新浪T.CN短网址批量生成工具推荐
- Analysis of Struts2 : http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html
- 遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
- 我们会是最后一批用五笔的中国人吗?
- 【Codecs系列】HEVC标准(五):帧间预测技术及x265实现分析
- mysql主从复制延迟解决
- 特征空间之点检测(MATLAB)
- java 2分钟_Java怎么判断他是否在2分钟内执行了任务?
- ps还原上一步快捷键_ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么...
- C语言公制长度转英制长度,英制换算(英制长度转换公制长度换算)