合并语句问题 - 错误无法在源表中获得一组稳定的行

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 行。 - 查询合并 - 我用这个合并语句弄乱了数据库表,我需要回滚吗?这可能吗 ?我不幸地发出了提交 开发环境开启归档日志可以回滚到之前的状态

以上是关于合并语句问题 - 错误无法在源表中获得一组稳定的行的主要内容,如果未能解决你的问题,请参考以下文章

无法在源表中获得一组稳定的行?

错误:ORA-30926:无法在源表中获得一组稳定的行

oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事

oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事

合并更新 oracle 无法获得一组稳定的行

Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中