合并语句问题 - 错误无法在源表中获得一组稳定的行
Posted
技术标签:
【中文标题】合并语句问题 - 错误无法在源表中获得一组稳定的行【英文标题】:Merge statement issue - error unable to get a stable set of rows in the source tables 【发布时间】:2020-03-27 19:28:51 【问题描述】:您好,我在 oracle db 中运行以下合并语句时遇到错误,您能告诉我如何解决以下错误吗?
--查询
MERGE INTO d_prod_fld dp USING
(SELECT stg_prod_fld_id,
prod_cd_id,
country_name
FROM stg_prod_fld_delta pd
LEFT OUTER JOIN d_loc dl ON (dl.prod_cd_num=lpad(pd.prod_cd_id, 3, '0'))
WHERE pd.efft_to > trunc(sysdate+1)
AND pd.prod_cd_id IS NOT NULL ) stg
ON (dp.cd_id=stg.stg_prod_fld_id)
WHEN matched THEN
UPDATE
SET dl.prod_country=stg.country_name;
d_prod_fld
- 目标维度表,
stg_prod_fld_delta
- 舞台表,
d_loc
- 查表
基本上,当我尝试在沙盒中运行上述查询时,它运行良好,但是当我尝试在实际开发环境中运行时,它显示上述错误 -
从第 1 行开始的错误命令 -
错误报告 - SQL 错误:ORA-30926:无法在源表中获得一组稳定的行 30926. 00000 - “无法在源表中获得一组稳定的行” *Cause: 由于大 dml 无法获得稳定的行集 活动或非确定性 where 子句。 *行动:删除任何非确定性 where 子句并重新发布 dml。
【问题讨论】:
【参考方案1】:这意味着并行 DML 发生在源表 stg_prod_fld_delta 或查找表 d_loc 中,它们正在修改 SELECT 查询的结果。
在运行 MERGE 语句之前,您需要使用 select * from table where condition =value for update no wait 获取 stg_prod_fld_delta 和 d_loc 的锁。
在 MERGE 语句之后也发出 COMMIT。
请检查以下内容
SELECT *
FROM stg_prod_fld_delta pd
WHERE pd.efft_to > trunc(sysdate+1)
AND pd.prod_cd_id IS NOT NULL
for update no wait;
select * from d_loc dl
for update no wait;
MERGE INTO d_prod_fld dp USING
(SELECT stg_prod_fld_id,
prod_cd_id,
country_name
FROM stg_prod_fld_delta pd
LEFT OUTER JOIN d_loc dl ON (dl.prod_cd_num=lpad(pd.prod_cd_id, 3,
'0'))
WHERE pd.efft_to > trunc(sysdate+1)
AND pd.prod_cd_id IS NOT NULL ) stg ON (dp.cd_id=stg.stg_prod_fld_id)
WHEN matched THEN
UPDATE
SET dl.prod_country=stg.country_name;
COMMIT;
【讨论】:
感谢 psaraj12 的解释,请您输入查询以便我测试 我试过 Psaraj12 它再次显示相同的错误,我真的不明白如果在沙箱中运行它运行良好,就好像我在开发环境中运行它显示相同的错误,我尝试在选择查询运行后添加不同的更新双记录..任何解决方案? 嗨,rakesh,你是什么意思更新双倍记录,请举个例子 Hi Raj 更正 - 合并了 17,413,741 行。 - 查询合并 - 我用这个合并语句弄乱了数据库表,我需要回滚吗?这可能吗 ?我不幸地发出了提交 开发环境开启归档日志可以回滚到之前的状态以上是关于合并语句问题 - 错误无法在源表中获得一组稳定的行的主要内容,如果未能解决你的问题,请参考以下文章
oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事