You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中CTE是否会反映数据变更?执行时机与实例验证

Oracle中CTE的执行时机与数据变更的关联性分析

结论先行

你给出的示例里,查询CTE TEMP 时会包含新插入的Jess记录。

核心原因:CTE的执行时机

Oracle里的普通CTE(无MATERIALIZE关键字)本质是延迟执行的子查询定义——它不会在WITH子句定义阶段就执行内部的SELECT语句并缓存结果,只有当后续SQL语句明确引用这个CTE的时候,才会触发CTE内部的查询逻辑。

结合你的代码分步解析

你的代码执行顺序是:

  1. 定义CTE TEMP:这一步只是告诉Oracle“我之后可能会用到这个查询逻辑”,并不会实际去读取table的数据;
  2. 执行INSERT语句:成功向table插入了Jess的记录;
  3. 执行select * from TEMP:此时才会触发CTE内部的select ... from table查询,去读取当前table的所有数据——这时table已经包含刚插入的新记录,所以查询结果自然会包含这条数据。

特殊情况:物化CTE

如果给CTE加上MATERIALIZE关键字(比如WITH TEMP AS (...) MATERIALIZE),情况会不一样:物化CTE会在定义阶段就执行查询并缓存结果,后续引用时直接用缓存的数据。这种情况下,如果你先定义物化CTE再插入数据,查询CTE就不会包含新记录。但默认情况下Oracle的CTE是非物化的,所以你的示例属于前者。

内容的提问来源于stack exchange,提问作者Juulu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:02:33