oracle - 合并语句问题 - 错误无法在源表中获得一组稳定的行
问题描述
嗨,我在 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 -“无法在源表中获得一组稳定的行”
*原因:无法在源表中获得一组稳定的行由于大量 dml 活动或非确定性 where 子句而获得。
*行动:删除任何非确定性 where 子句并重新发布 dml。
解决方案
这意味着并行 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;
推荐阅读
- c# - 当模型包含另一个类的对象作为使用 DataAnnotations 的属性时,如何在控制台应用程序中验证 .Net Core 3.1 中的模型?
- java - 如何忽略 .append 方法中的第一个符号?
- python - KeyError:“在'ModelForm'中找不到键'field_name'。选择是:...,
- javascript - 后缀属性中的 vue-tabs-component v-bind 变量
- python - 如何一个接一个地找到重复的字符串?
- java - 如何在 Java 中使用 ElasticSearch JSON DSL?
- reactjs - 比较两个对象以生成第三个对象
- c# - 在asp.net core3.1 webapi中处理我的多对多关系api请求
- java - DB丢失时的书城春天
- bash - 通过管道从 find 命令的输出获取在 bash 中创建的最新目录