现象:
根据ibatis日志情况来看,当preReleaseTimes同时存在为空和不为空的数据时,如果按照以下的查询语句执行:
select max(m.preReleaseTimes) from SIMS_CREDITPOINT m,CP_SIMS n
where m.icpCode = n.icpCode
and n.icpType = '4'
and t.checkMonth = '200804'
and t.typeId = '01'
查询的结果为空,此情况在我们32个oracle数据库中,只有2个数据库会存在问题。
如果我们修改一下查询语句,在max中加上to_number:
select max((to_number(m.preReleaseTimes)) from SIMS_CREDITPOINT m,CP_SIMS n
where m.icpCode = n.icpCode
and n.icpType = '4'
and t.checkMonth = '200804'
and t.typeId = '01'
则可以查询出相关的正确结果。
在oracle中number类型的数据可以为空,当空数据和不为空的数据同时存在的时候,使用max函数查询则会偶尔为空。这样的情况不会出现在所有的场合,解决这个问题需要对表统计分析一下。
解决方法:
EXEC Dbms_Stats.gather_table_stats('数据库用户名,需要全部大写','表名,需要大写');
程序员应该注意的:
在写查询函数的时候,对number类型的max的时候,应该:max(to_number(col)),同时定义number类型的字段的时候尽量让它的初始值0。