首页 > 解决方案 > 合并语句问题 - 错误无法在源表中获得一组稳定的行

问题描述

嗨,我在 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;

基本上,当我尝试在沙箱中运行上述查询时,它运行良好,但是当我尝试在实际开发环境中运行时,它显示上述错误 -

从行开始的错误:命令中的 1 -

错误报告 -
SQL 错误:ORA-30926:无法在源表中获得一组稳定的行
30926. 00000 -“无法在源表中获得一组稳定的行”
*原因:无法在源表中获得一组稳定的行由于大量 dml 活动或非确定性 where 子句而获得。
*行动:删除任何非确定性 where 子句并重新发布 dml。

标签: oraclesql-merge

解决方案


这意味着并行 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;

推荐阅读