Estoy recibiendo
ORA-30926: no se puede obtener un conjunto estable de filas en las tablas de origen
en la siguiente consulta:
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';
He ejecutado tabla_1
que tiene datos y también he ejecutado la consulta interior (src
) que también tiene datos.
¿Por qué se produce este error y cómo se puede resolver?
Esto suele ser causado por duplicados en la consulta especificada en la cláusula USING. Esto probablemente significa que TABLE_A es una tabla padre y el mismo ROWID es devuelto varias veces.
Podría resolver rápidamente el problema utilizando un DISTINCT en su consulta (de hecho, si 'Y' es un valor constante ni siquiera necesita ponerlo en la consulta).
Suponiendo que tu consulta sea correcta (no conozco tus tablas) podrías hacer algo así
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';
Probablemente esté intentando actualizar la misma fila de la tabla de destino varias veces. Acabo de encontrar el mismo problema en una sentencia merge que he desarrollado. Asegúrese de que su actualización no toca el mismo registro más de una vez en la ejecución de la fusión.
¿Cómo solucionar los errores ORA-30926? (Doc ID 471956.1)
alter session set events '30926 trace name errorstack level 3';
o
alter system set events '30926 trace name errorstack off';
y ver los archivos .trc en UDUMP cuando ocurra.
3.1) ¿Es la sentencia SQL un MERGE? Evalúe los datos devueltos por la cláusula USING para asegurarse de que no hay valores duplicados en la unión. Modifique la sentencia merge para incluir una cláusula where determinista
3.2) ¿Se trata de una sentencia UPDATE a través de una vista? Si es así, intente rellenar el resultado de la vista en una tabla e intente actualizar la tabla directamente.
3.3) ¿Hay un trigger en la tabla? Pruebe a desactivarlo para ver si sigue fallando.
3.4) ¿Contiene la sentencia una vista no fusionable en una 'IN-Subquery'? Esto puede provocar que se devuelvan filas duplicadas si la consulta tiene una cláusula "FOR UPDATE". Véase el error 2681037
3.5) ¿Tiene la tabla columnas no utilizadas? La eliminación de éstas puede evitar el error.