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

2020-12-29 19:26:59 +08:00
 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存在值

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

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

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

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

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

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

© 2021 V2EX