IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ORACLE的max函数对number类型的bug

    longhao (longtask@gmail.com)发表于 2009-03-26 12:53:36
    love 0

    现象:
    根据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。

     



沪ICP备19023445号-2号
友情链接