【问题标题】:Oracle Same Query return Different Result on Different Connection (Uncommit Transaction)Oracle 相同的查询在不同的连接上返回不同的结果(取消提交事务)
【发布时间】:2019-06-27 21:36:10
【问题描述】:

我有 2 个使用 相同查询但返回不同结果的 oracle 连接:

SELECT TO_CHAR(DATE_TIME, 'yyyy-MM-dd hh:mi:ss' ) myDateTime,
t.*
FROM TMI_ISD_AUDIT_TRAIL t
WHERE NVL(USER_ID,'') LIKE '%'
AND NVL(Action,'') LIKE '%'
AND NVL(success,'') LIKE '%%'
AND TO_CHAR(DATE_TIME, 'yyyy-MM-dd' ) LIKE '%'
AND rownum <100

查询返回 1 行

查询返回 2 行

连接 1 IP: 连接 2 IP:

如何检查底层未提交的事务?

【问题讨论】:

  • 我能想象到这种情况发生的唯一方法是,如果底层数据实际上在两个查询之间发生了变化。
  • 不,先生。到目前为止没有交易..
  • 如果您删除rownum 条件,它会返回相同的交易吗?
  • 删除 rownum 返回相同的先生
  • 是的,这看起来很奇怪。历史教训表明,事情并没有像你想象的那样发生。不幸的是,我们只能猜测可能的解释是什么。我同意@TimBiegeleisen 的观点,即未提交的交易似乎是最可能的解释。您的屏幕截图似乎有两个选项卡,为每个连接显示 TMI_ISD_AUDIT_TRAIL:它们是否反映了工作表查询的不同结果?

标签: sql oracle


【解决方案1】:

使用Oracle 12,您可以使用fetch first 代替ROWNUM 进行排序

ROWNUM 在 ORDER BY 之前计算,这不是 ROWNUM 的使用方式。

SELECT TO_CHAR(DATE_TIME, 'yyyy-MM-dd hh:mi:ss' ) myDateTime,
t.*
FROM TMI_ISD_AUDIT_TRAIL t
WHERE NVL(USER_ID,'') LIKE '%'
AND NVL(Action,'') LIKE '%'
AND NVL(success,'') LIKE '%%'
AND TO_CHAR(DATE_TIME, 'yyyy-MM-dd' ) LIKE '%'
ORDER BY TO_CHAR(DATE_TIME, 'yyyy-MM-dd hh:mi:ss' )
FETCH FIRST 100 ROWS ONLY;

如果需要,可以与结果偏移子句结合使用 fetch first 子句,它限制了结果集中返回的行数。 fetch first 子句有时可用于从其他较大的结果集中仅检索几行,通常与 ORDER BY 子句结合使用。使用本条款可以提高效率。此外,它还可以使应用程序的编程变得更简单。

【讨论】:

  • 我试过了,还是没变。第一个查询返回 2,其他查询返回 1。
  • @toha 为什么要使用LIKE '%' 条件?
  • @toha 顺便说一句,where nvl(action,'') like '%' 是一种复杂的写法where action is not null
  • 有但查询到的数据没有空记录
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多