ORA 30926 - 无法在源表中获得稳定的行集

时间:2016-03-18 13:21:01

标签: oracle

我最近在Merge语句中遇到了一个奇怪的问题。它因 ORA 30926错误而失败。

我已经检查了下面的陷阱,

  1. 在源表和目标表中重复记录检查 - 清理出来
  2. 来源和目标表分析结构 - 干净利落
  3. 来源和目标表索引分析结构 - 干净利落
  4. DBA在SYS用户中尝试时使用相同的合并SQL - 工作。仍然困惑
  5. 相同的合并SQL在Target - Worked的Copy表中成功运行。仍然困惑
  6. DBA退回了TEST服务器。虽然没有说服力,但想要试一试,因为问题似乎很奇怪 - 没有锻炼
  7. 收集统计数据
  8. 截断原始目标表并从Copy表重新加载并再次尝试合并 - 没有锻炼。失败并出现同样的错误
  9. 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

2 个答案:

答案 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策略的位置。如果有,请尝试禁用它们并重试合并。