我最近在Merge语句中遇到了一个奇怪的问题。它因 ORA 30926错误而失败。
我已经检查了下面的陷阱,
Nutshell Script:
MERGE INTO TGT_SCHEMA.EMP T
USING SRC_SCHEMA.S_EMP S
ON
(
T.EMPLOYEE_NO = S.EMPLOYEE_NO AND
T.START_DATE = S.START_DATE
)
目标表上存在唯一索引(EMPLOYEE_NO, START_DATE
),源表上存在相同组合的普通索引。目标表是一个分区表,并且有一些VPD策略应用于其他列。
我的数据库版本: Oracle 11.2.0.3.0
答案 0 :(得分:0)
当USING子句根据匹配条件为一个或多个目标行返回多行时,MERGE会发生此错误。由于它无法知道首先执行哪两个更新,因此放弃了。
运行:
SELECT matching_column1, ..matching_ColumnN, count(*)
FROM (
<your USING query>
)
group by matching_column1, ..matching_ColumnN
having count(*) > 1
查找有问题的源数据。此时,请修改USING查询以解决问题,更改匹配条件或清理错误数据 - 以适当者为准。
编辑 - 添加其他项目:
另一种可能性 - 如果您尝试更新目标中ON列中引用的列,则会出现此错误。
因此,请确保您没有尝试更新EMPLOYEE_NO或START_DATE字段。
答案 1 :(得分:0)
如果你真的检查过你所说的一切,那么这有点令人费解。我认为诊断检查表中的#4可能会告诉:当作为SYS执行时,相同的语句有效。
为了好玩,请检查两个表(DBMS_RLS
包)上的VPD策略的位置。如果有,请尝试禁用它们并重试合并。