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 类似,但未得到确认,总之,以后尽量不要这么写...
分享到:
相关推荐
本文详细介绍在Windows系统上通过iscsi 连接存储共享模式,部署安装oracle 12c rac asm模式,适合新手练习!如有疑问,可留言!
Oracle 分析函数、窗口函数和报表函数是数据库查询和数据分析中的关键工具,尤其在复杂的OLAP(在线分析处理)系统中发挥着重要作用。在Oracle数据库中,这些功能提供了对大量数据进行高效处理的能力,帮助用户生成...
Oracle 左连接右连接学习 Oracle 中的连接(Join)是一种强大的工具,用于将两个或多个表合并成一个结果集。在学习 Oracle 连接时,可能会感到困惑,因为有多种类型的连接,每种类型都有其特点和应用场景。下面我们...
2. 创建连接池:通过oci池化函数ociPoolCreate创建连接池,指定最小、最大连接数以及空闲连接超时时间。 3. 获取连接:当需要访问数据库时,从连接池中获取一个已建立的连接,而不是每次都新建。 4. 使用连接:执行...
oracle中sql语句(+)符号代表连接 (+)在=前边为右连接 (+)在=后边为左连接 SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* from a right join b SELECT a.*, b.* from a = b(+)就是一个左连接...
在IT行业中,数据库连接是应用程序开发中的重要环节,特别是对于使用Visual C++(简称VC)进行Windows应用程序开发的程序员来说,能够有效地与Oracle数据库交互至关重要。"VC+ADO+ORACLE连接"的主题聚焦于如何利用...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 第一章 --操作数据 1、 关于HtmlHelper和UrlHelper 因为大部分的web请求的目标都是向客户端发送HTML代码。因此,Asp.Net MVC也是 为我们创建HTML提供了各种帮助。...
深入理解Oracle数据库体系结构,大师之作,推荐阅读。
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW安装文档.pdf
Oracle 递归函数介绍 Oracle 递归函数是一种特殊的PL/SQL函数,可以用于解决复杂的树形结构查询问题。递归函数可以自我调用,以便遍历树形结构的每个节点,直到达到停止条件。 在 Oracle 中,递归函数的定义语法...
Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录
OracleXE112 + plsqldeve1106+chinese_Win64.zip 这个压缩包文件包含了两个重要的组件,OracleXE112 和 plsqldev1106x64,它们都是Oracle数据库相关的工具。OracleXE112 是Oracle数据库的一个精简版,称为Oracle ...
通过oracle jdbc thin 驱动连接oracle数据库的客户端程序,在连接中应用了SSL、钱包、双向认证、Secure External Password Store tns配置等技术,完全实战代码,非常有参考价值。
1、oracle分析函数 中文: 主要含: rank() 和 dense_rank() first_value()和last_value() row_number() LAG() range开窗函数 2、oracle分析函数 英文: 比较详细
Oracle连接有多中,我是在平常开发项目过程中用到的Oracle左连接进行了简单的阐述。
内部包含:win32位:oracle客户端instantclient(是11.0版本的)+navicate; win64位 :oracle客户端instantclient(是11.0版本的)+navicate; 下载安装后,再配置环境变量,navicate加载oci.dll即可;具体可以参考...
Oracle内置函数是数据库管理系统Oracle中不可或缺的一部分,它们用于执行各种数据处理任务,包括数学运算、字符串操作、日期处理等。这篇博文将深入探讨Oracle内置函数的学习,帮助你更好地理解和运用这些功能强大的...