【问题标题】:Oracle SQL: CTE Query gives different results in TOAD, depending on how executedOracle SQL:CTE 查询在 TOAD 中给出不同的结果,具体取决于执行方式
【发布时间】:2022-10-12 21:40:39
【问题描述】:

我有一个看起来相当简单的 CTE 查询:

with cte1 as 
( 
    Select row_number () over (
         order by id1 desc
         )rn,
         T.*         
from   schema1.table1 T
)
select * from cte1
WHERE (rn < 11)  
ORDER BY rn, id1 desc
;

但是,使用“TOAD”数据库工具执行时,它会给出不同的结果。

如果我使用执行按钮(“播放”),它会给出我认为正确的结果,包括我最近插入.

如果我使用“作为脚本执行”按钮,它会给出不同的结果,省略最近插入排。

出于安全原因,我更改了架构名称、表名和列名等详细信息。另外,我无法提供使用的实际数据。

根据查询的运行方式,是否有正当的理由为什么会得到不同的结果?

对我来说,这非常令人不安,我会发现它是一个“错误”,而不是一个“功能”。

注意:根据接受的答案,问题出在(未显示的)插入脚本中[未提交插入],不是使用 CTE 代码或使用 TOAD。

【问题讨论】:

    标签: sql oracle toad


    【解决方案1】:

    确保您COMMIT 您的数据。

    如果您不COMMIT,那么只有创建数据的会话才能看到未提交的数据,而其他会话,即使属于同一用户的会话,也永远不会看到未提交的数据。

    例如,可以解释该行为:

    • 如果 Toad 保持会话打开并将其重新用于其“播放”操作,那么它将看到在会话早期创建的未提交数据。
    • 但是,如果 Toad 在使用“作为脚本执行”操作时为同一用户生成新会话,则它不会看到未提交的数据。

    【讨论】:

    • 是的,这解决了问题。所以“错误”是我没有使用(未显示的)插入脚本提交,当我这样做时,问题就消失了。
    • @JosephDoggie 出人意料的“功能”是Toad 对两种执行方法使用不同的会话(而不是重用同一个会话)。您可以争论使用不同的会话是否是一个错误,但是从用户的角度来看,正如您发现的那样,当有未提交的数据时,它可能会导致不同的行为;不提交不是错误,使用不同的会话可能有正当理由,但行为不符合用户的期望(即使可以解释)。
    • 在我试图做的“不提交”的情况下,这是我的一个遗漏,就像一个错误。显然,这将取决于上下文。
    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2018-12-22
    • 1970-01-01
    • 2022-06-21
    • 2017-09-01
    • 2014-06-18
    相关资源
    最近更新 更多