请教各位吴彦祖一个问题:同一个 SQL, Java 和 plsql 的查询结果不一致.

2020 年 12 月 29 日
 yveJohn

请不要吐槽使用的上古框架,这是公司的屎山项目,必须得用!!!

根据百度、谷歌查询的解决方案已排除以下问题:

  1. 程序和 plsql 连接的数据源不一致
  2. plsql 中存在未提交的数据
  3. ibatis 缓存导致

SQL 语句因为公司行业敏感,不能放出来给大家看,大概类似下面的代码

with TEMP_TABLE AS(
	SELECT ITEM_CODE,ITEM_NAM·····
    FROM TABLE1
    WHERE ITEM_CODE = '***'
    ORDER BY ITEM_CODE
)
SELECT A.ITEM_LVL,A.MARK,B.ITEM_NAM,SUM(A.VALUE) VALUE
FROM TABLE2 A
LEFT JOIN TEMP_TABLE B ON A.ITEM_CODE = B.ITEM_CODE
GROUP BY A.ITEM_LVL,A.MARK,B.ITEM_NAM

具体的错误表现是程序中查询时VALUE始终为 0,但是把程序执行的 SQL 拿到 plsql 中执行VALUE存在值

3266 次点击
所在节点    程序员
11 条回复
huntcool001
2020 年 12 月 29 日
Mysql 有 general log, PQ 应该也有类似的东西. 直接连上服务端看日志,看你的代码客户端发过来的查询语句是什么.
xuanbg
2020 年 12 月 29 日
value 是关键词,用``包一下
lordofhollows
2020 年 12 月 29 日
可能是因为有 value 为 null 的记录,可以试下:sum(nvl(a.value, 0))
yveJohn
2020 年 12 月 30 日
@xuanbg 只是个例子,实际上不是 value

@lordofhollows value 这个值没有空数据,而且如果是 value 存在 null 数据,为什么 plsql 能查询出正确结果呢?
@huntcool001 是个好思路,我现在 oracle 的日志看能不能找到原因。
tikazyq
2020 年 12 月 30 日
为啥不是刘德华?
tutou
2020 年 12 月 30 日
@tikazyq 因为彦祖也秃了
yveJohn
2020 年 12 月 30 日
@tikazyq #5 问题能解决你就是我心中的刘天王😭
yveJohn
2020 年 12 月 30 日
@tutou #6 别说真话!!!
TomatoCLI
2020 年 12 月 30 日
本吴彦祖提供一个思路,上次某人遇到这个问题是时区的原因...
hodur
2020 年 12 月 30 日
我上次遇到这样的问题是因为字段映射错误,在 SUM(A.VALUE) 加个 alias 试试
yveJohn
2020 年 12 月 31 日
@hodur #10 已验证不是这个问题.
@cyrivlclth #9 时区问题顶多会导致数据不一致,而不会导致数据始终为 0 吧😭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/740096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX