【问题标题】:ORA 30926 - Unable to get stable set of rows in source tablesORA 30926 - 无法在源表中获得稳定的行集
【发布时间】:2022-03-06 08:00:40
【问题描述】:

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

我已经检查了以下陷阱,

  1. 在源表和目标表中检查重复记录 - 干净了
  2. 源表和目标表分析结构 - 干净利落
  3. 源表和目标表索引分析结构 - 干净利落
  4. 当 DBA 在 SYS 用户中尝试时,使用相同的合并 SQL – 有效。仍然令人费解
  5. Same Merge SQL 在 Target 的 Copy 表中成功运行 - 已工作。仍然令人费解
  6. DBA 退回了 TEST 服务器。虽然没有说服力,但想尝试一下,因为这个问题似乎很奇怪——没有锻炼
  7. 收集统计数据
  8. 截断原始目标表并从复制表重新加载并再次尝试合并 - 没有锻炼。失败并出现同样的错误

简而言之脚本:

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

【问题讨论】:

  • 您的更新部分是否尝试更新目标表上的employee_no 或start_Date 字段?您无法更新匹配的 ON 子句中引用的字段....

标签: oracle


【解决方案1】:

如果你真的检查了你所说的一切,那么这有点令人困惑。我认为您的诊断清单中的 #4 可能说明:当以 SYS 执行时,相同的语句有效。

为了好玩,请查看任一表(DBMS_RLS 包)上的任何 VPD 政策。如果有,请尝试禁用它们并重试合并。

【讨论】:

    【解决方案2】:

    当 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 字段。

    【讨论】:

    • 根据他的帖子,这是他尝试的第一件事。
    • 错过了,所以我添加了另一件事来检查。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2014-03-23
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多