You need to enable JavaScript to run this app. Oracle使用INSERT ALL插入两表时SYS_GUID不一致如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Oracle使用INSERT ALL插入两表时SYS_GUID不一致如何解决

问题根因

SYS_GUID()属于非确定性函数,Oracle执行INSERT ALL语法时,每一个INTO子句都会重新计算一次SELECT列表中的表达式,因此插入两张表时会生成不同的GUID,导致id无法对应。

修复方案

将SYS_GUID()的计算逻辑放到内层子查询中,强制提前生成固定的id结果集,再供给INSERT ALL使用即可,适配多行数据返回的场景,正确写法如下:

insert all
 into table_a values(id, name)
 into table_a_a values(id, name)
select id, name from (
  select SYS_GUID() AS id, name from table_source
);

兜底兼容方案

如果遇到Oracle优化器自动展开子查询、依旧重复生成GUID的极端情况,可以使用带MATERIALIZE提示的CTE强制固化结果集:

WITH source_data AS (
  SELECT /*+ MATERIALIZE */ SYS_GUID() AS id, name FROM table_source
)
INSERT ALL
 INTO table_a VALUES(id, name)
 INTO table_a_a VALUES(id, name)
SELECT id, name FROM source_data;

验证方法

执行插入前可单独运行内层SELECT语句,确认每一行的id固定生成后,再套入INSERT ALL逻辑即可保证两张表的id完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 10:27:04