目录
不想看原因的,请直接跳转到最后.查看解决方式
背景:
突然接到一个bug, 说是小于零的数据 在数据库中显示异常, 不显示 0.55 而显示 .55,小数点前面的零不见了,这就很奇怪了.怎么会这样.查看发现大于零的数字都不会这样.只有小于零的数字会这样.怪事;
经过排查 将问题定位到了数据合并插入的时候;
查看存储过程发现在合并插入的过程中有这么一段
insert into tableName( column1, column2, ....)
select t2.column1, sum(t2.column2) ,...
from TableName2 t2 where A = A and B=B.....
就是这么一句语句 .问题就出现在sum(t2.column2)
原因:
- 经过查看,我发现t2.column2 在tableName2 中是varchar2 类型的也就是讲它是一个字符串属性的数据
- 经过sum()聚合函数后被转化成了number 属性 也就是数字
- 然后在插入的时候,数字转换成字符串的时候 会隐式调用 to_char(number,'fm9999999999.99'),然后0 就被干掉了;
演示 1:
select to_char(sum(0.12)) from dual
结果:
演示2 :
select to_char(0.12) from dual
结果:
其实这是因为 to_char 格式化 默认传的格式化参数是 fm999999999.99 所以0被干掉了
解决方式 :
就是对sum()聚合函数做to_char处理,处理方式如下:
select to_char(sum('0.012'),'fm9999990.999') from dual
结果如下:
以上便是我解决此bug的方式,如果你们还有其他好的方式请留言,最后关于FM 格式化的知识,大家请自行百度