oracle窗口函数导致的灵异bug
现象描述:
oracle存储过程中使用窗口函数累积表中的某一字段,分别在10.2.0.3,10.2.0.4库中进行过详尽测试,没出现过问题,但是上线后出现bug,且稳定复现,分析后确定问题,窗口函数累积出错。
进一步分析发现:sql中OVER PARTITION BY 条件与FROM表的关联条件是相同的三个字段,于是试着调整FROM表的关联条件为另外的PK字段,问题解决。
最开始关联条件的三个字段与调整后的PK字段在维度上是一致的,也就是说,字段A+字段B+字段C就能确定到唯一的一条字段PK,不应该出现这样的问题,本地不能复现,生产环境不能碰,最后只好归结到oracle出现bug上去...
SQL如下:
改前:
select nvl(acc.A, 0) + sum(tf.A) over(partition by tf.pk1, tf.pk2, tf.pk3 order by tf.C)
from t_temp_flow tf
inner join t_temp_acccount ta
on tf.pk1 = ta.pk1 and tf.pk2 = ta.pk2 and tf.pk3 = ta.pk3
left join (select * from t_account where corp = :1) acc
on pf.pk1 = acc.pk1 and pf.pk2 = acc.pk2 and pf.pk3 = acc.pk3
改后:
select nvl(acc.A, 0) + sum(tf.A) over(partition by tf.pk1, tf.pk2, tf.pk3 order by tf.C)
from t_temp_flow tf,
t_temp_acccount ta,
(select * from t_account where corp = :1) acc
where tf.pk1 = ta.pk1
and tf.pk2 = ta.pk2
and tf.pk3 = ta.pk3
and ta.pk = acc.pk(+)
维度:pk1+pk2+pk3 = 唯一pk
不知道有没同学遇到过类似问题,partition by的条件 = on的条件时计算混乱的情况。
经过确认:这样的写法确实容易出现问题,项目上线后因为类似的原因爆出另一个bug,竟然在存储过程执行过程中多出6万条数据。解决方案是将操作拆分成两步来完成。
怀疑与oracle现有bug 8278320 Wrong results from CONNECT BY with ORDER BY 类似,但未得到确认,总之,以后尽量不要这么写...
分享到:
相关推荐
Oracle+查看+表+存储过程+触发器+函数+等对象定义语句的方法Oracle+查看+表+存储过程+触发器+函数+等对象定义语句的方法
实现+Oracle+连接+SQL+Server实现+Oracle+连接+SQL+Server
oracle 管道函数 动态游标,自定义类型,转table
本文详细介绍在Windows系统上通过iscsi 连接存储共享模式,部署安装oracle 12c rac asm模式,适合新手练习!如有疑问,可留言!
这里实现ADO连接数据库的最简单代码,有利于初学数据库编程人员的参考,希望能对你有帮助!!!
oracle分析函数,窗口函数,报表函数 分析函数(OVER) 分析函数2(Rank, Dense_rank, row_number) 分析函数3(Top/Bottom N、First/Last、NTile)
windows server 2008 下,制作批处理文件(安装oracle 10g +创建数据库)
SSM+ORACLE+SpringMvc+MavenSSM+ORACLE+SpringMvc+Maven
Oracle+表连接方式(内连接-外连接-自连接)+详解
NULL 博文链接:https://juji1010.iteye.com/blog/1450311
详解Oracle分析函数,主用于OLAP,以实例讲解分析函数. 如: 排序用Rank, Dense_rank, row_number 1.带空值的排列 2.Top/Bottom N查询 3.First/Last排名查询 4.按层次查询 1.窗口函数简介 2.窗口函数示例-全统计 3....
oracle 左连接 右连接 学习 精选资料
oracle中sql语句(+)符号代表连接 (+)在=前边为右连接 (+)在=后边为左连接 SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* from a right join b SELECT a.*, b.* from a = b(+)就是一个左连接...
Oracle+表连接方式(内连接-外连接-自连接) 详细介绍的连接的类型及应用实例,一份值得看的数据库资料,强列建义下载
oracle分析函数(用法+实例),这属于oracle的高级应用。
Oracle左连接,右连接.doc Oracle左连接,右连接.doc
oracle11g+sqlserver2000+透明网关11g配置 原创
java 连接数据库用的jdbc jar包(oracle+sql+mysql)+连接各种数据库的方法总结。
深入理解Oracle数据库体系结构,大师之作,推荐阅读。
数据库连接驱动jar包,oracle+db2+mysql