unable the tables stable source ora error err ejemplo oracle sql-merge

oracle - the - ORA-30926: no se puede obtener un conjunto estable de filas en las tablas fuente



merge pl sql (4)

estoy obteniendo

ORA-30926: no se puede obtener un conjunto estable de filas en las tablas fuente

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 la table_1 tiene datos y también he ejecutado la consulta interna ( src ) que también tiene datos.

¿Por qué viene este error y cómo se puede resolver?


¿Cómo solucionar problemas de errores ORA-30926? (Doc ID 471956.1)

1) Identifique la declaración que falla

alterar los eventos del conjunto de sesiones ''30926 nombre de rastreo errorstack nivel 3'';

o

alterar los eventos del set system ''30926 trace name errorstack off'';

y busque archivos .trc en UDUMP cuando ocurra.

2) Al haber encontrado la declaración SQL, verifique si es correcta (tal vez utilizando el plan de explicación o tkprof para verificar el plan de ejecución de la consulta) y analice o calcule las estadísticas en las tablas correspondientes si esto no se ha realizado recientemente. Los índices de reconstrucción (o caída / recreación) también pueden ser útiles.

3.1) ¿La instrucción SQL es MERGE? evalúe los datos devueltos por la cláusula USING para asegurarse de que no haya valores duplicados en la unión. Modificar la instrucción de fusión para incluir una cláusula deterministic where

3.2) ¿Es esta una declaración ACTUALIZADA a través de una vista? De ser así, intente llenar el resultado de la vista en una tabla e intente actualizar la tabla directamente.

3.3) ¿Hay un disparador sobre la mesa? Intenta inhabilitarlo para ver si aún falla.

3.4) ¿La declaración contiene una vista no fusionable en una ''Subconsulta IN''? Esto puede hacer que se devuelvan filas duplicadas si la consulta tiene una cláusula "FOR UPDATE". Ver el error 2681037

3.5) ¿Tiene la tabla columnas sin usar? Dejar caer estos puede prevenir el error.

4) Si la modificación del SQL no soluciona el error, el problema puede estar en la tabla, especialmente si hay filas encadenadas. 4.1) Ejecute la sentencia ''ANALYZE TABLE VALIDATE STRUCTURE CASCADE'' en todas las tablas utilizadas en el SQL para ver si hay corrupciones en la tabla o sus índices. 4.2) Verifique y elimine cualquier ROWS ENCADENADO o migrado en la mesa. Hay formas de minimizar esto, como la configuración correcta de PCTFREE. Use la Nota 122020.1 - Encadenamiento de filas y migración 4.3) Si la tabla también está indexada, consulte: Nota 102932.1 - Monitoreo de filas encadenadas en IOT


Esto generalmente es 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 se devuelve varias veces.

Puede resolver el problema rápidamente usando DISTINCT en su consulta (de hecho, si ''Y'' es un valor constante, ni siquiera necesita ponerlo en la consulta).

Suponiendo que su consulta es correcta (no conozca sus tablas) podría hacer algo como esto:

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és tratando de actualizar la misma fila de la tabla objetivo varias veces. Acabo de encontrar el mismo problema en una declaración de fusión que desarrollé. Asegúrese de que su actualización no toque el mismo registro más de una vez en la ejecución de la fusión.


Tenía el error hoy en un 12c y ninguna de las respuestas existentes se ajusta (no hay duplicados, no hay expresiones no deterministas en la cláusula WHERE). Mi caso estaba relacionado con esa otra causa posible del error, de acuerdo con el texto del mensaje de Oracle (énfasis a continuación):

ORA-30926: no se puede obtener un conjunto estable de filas en las tablas fuente
Causa: no se pudo obtener un conjunto estable de filas debido a la gran actividad de dml o una cláusula where no determinista.

La fusión formaba parte de un lote más grande y se ejecutó en una base de datos en vivo con muchos usuarios concurrentes. No hubo necesidad de cambiar la declaración. Acabo de comprometer la transacción antes de la fusión, luego ejecuté la fusión por separado y volví a comprometerme. Entonces, la solución se encontró en la acción sugerida del mensaje:

Acción: elimine cualquier cláusula where no determinista y vuelva a emitir el dml .