我正在得到
ORA-30926: 无法在源表中获得一组稳定的行。
在下面的查询中。
MERGE INTO table_1 a
USING
(SELECT a.ROWID row_id, 'Y'
FROM table_1 a ,table_2 b ,table_3 c
WHERE a.mbr = c.mbr
AND b.head = c.head
AND b.type_of_action <> '6') src
ON ( a.ROWID = src.row_id )
WHEN MATCHED THEN UPDATE SET in_correct = 'Y';
我运行了table_1
,它有数据,我也运行了内部查询(src
),也有数据。
为什么会出现这种错误,如何解决?
这通常是由USING子句中指定的查询中的重复引起的。这可能意味着TABLE_A是一个父表,同一个ROWID被多次返回。
你可以通过在查询中使用DISTINCT来快速解决这个问题(事实上,如果'Y'是一个常量值,你甚至不需要把它放在查询中)。
假设你的查询是正确的(不知道你的表),你可以做这样的事情。
MERGE INTO table_1 a
USING
(SELECT distinct ta.ROWID row_id
FROM table_1 a ,table_2 b ,table_3 c
WHERE a.mbr = c.mbr
AND b.head = c.head
AND b.type_of_action <> '6') src
ON ( a.ROWID = src.row_id )
WHEN MATCHED THEN UPDATE SET in_correct = 'Y';
如何解决ORA-30926错误的问题?(文件编号471956.1)
alter session set events '30926 trace name errorstack level 3';
或
alter system set events '30926 trace name errorstack off';
并在发生时观察UDUMP中的.trc文件。
3.1) 该SQL语句是一个MERGE吗? 评估由USING子句返回的数据,以确保在连接中没有重复的值。修改合并语句以包括一个确定的where子句
3.2) 这是一个通过视图的UPDATE语句吗? 如果是,请尝试将视图的结果填充到一个表中,并尝试直接更新该表。
3.3) 表上是否有一个触发器?试着禁用它,看看是否仍然失败。
3.4) 语句中是否包含一个'IN-Subquery'的非合并视图?如果查询有一个"FOR UPDATE"子句,这可能导致重复的记录被返回。参见Bug 2681037
3.5) 该表是否有未使用的列?丢掉这些列可能会防止错误的发生。