ORA-30926:No se puede obtener un conjunto estable de filas en las tablas de origen.

StackOverflow https://stackoverflow.com/questions/2337271

  •  22-09-2019
  •  | 
  •  

Pregunta

estoy obteniendo

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

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

¿Fue útil?

Solución

Este es causada generalmente 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.

Se podría resolver rápidamente el problema mediante el uso de un DISTINCT en la consulta (de hecho, si 'Y' es un valor constante que ni siquiera necesita para ponerlo en la consulta).

Asumiendo que su consulta es correcta (no sé las tablas) se 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';

Otros consejos

Usted está probablemente tratando de actualizar la misma fila de la tabla de destino varias veces. Yo sólo encontré con el mismo problema en un comunicado de combinación 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?(ID del documento 471956.1)

1) Identificar la declaración fallida

alterar los eventos del conjunto de sesiones '30926 error de nombre de seguimiento nivel 3';

o

alterar los eventos configurados del sistema '30926 errores de nombre de seguimiento desactivados';

y esté atento a los archivos .trc en UDUMP cuando esto ocurra.

2) Habiendo encontrado la declaración SQL, verifique si es correcta (quizás usando el plan de explicación o tkprof para verificar el plan de ejecución de la consulta) y analice o calcule estadísticas en las tablas en cuestión si esto no se ha hecho recientemente.Reconstruir (o eliminar/recrear) índices también puede ayudar.

3.1) ¿La declaración SQL es una FUSIÓN?evalúe los datos devueltos por la cláusula USING para garantizar que no haya valores duplicados en la combinación.Modifique la declaración de fusión para incluir una cláusula determinista donde

3.2) ¿Es esta una declaración de ACTUALIZACIÓN a través de una vista?Si es así, intente completar el resultado de la vista en una tabla e intente actualizar la tabla directamente.

3.3) ¿Hay algún disparador sobre la mesa?Intente desactivarlo para ver si todavía falla.

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

3.5) ¿La tabla tiene columnas no utilizadas?Dejarlos caer puede evitar 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 instrucción 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' en todas las tablas utilizadas en SQL para ver si hay daños en la tabla o sus índices.4.2) Verifique y elimine cualquier FILA ENCADENADA o migrada en la tabla.Hay formas de minimizar esto, como la configuración correcta de PCTFREE.Use la nota 122020.1 - encadenamiento y migración de fila 4.3) Si la tabla está organizada adicionalmente el índice, consulte:Nota 102932.1: Monitoreo de filas encadenadas en IOT

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

  

ORA-30926: no se puede obtener un conjunto estable de filas en las tablas de origen
  Causa:. Un conjunto estable de filas no se podía obtener debido a la actividad DML grande o un no determinista cláusula where

La fusión fue parte de un lote más grande, y fue ejecutado en una base de datos en vivo con muchos usuarios concurrentes. No había ninguna necesidad de cambiar el comunicado. Acabo de enviar la transacción antes de la fusión, y luego corrió la fusión por separado, y se comprometió de nuevo. Así que la solución se encuentra en la acción sugerida del mensaje:

  

Acción:. Retire no determinista donde cláusulas y volver a emitir el DML

SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

Este error me ocurrió debido a registros duplicados (16K)

I probado con unico funciono .

Pero nuevamente, cuando intenté fusionar sin el mismo proble único, ocurrió la segunda vez que se debió a Commit

después de la fusión, si no se realiza la confirmación, se mostrará el mismo error.

Sin unico, Query funcionará si se realiza una confirmación después de cada operación de fusión.

A aclaración adicional a la utilización de DISTINCT para Solucionar error ORA-30926 en el caso general:

Debe asegurarse de que el conjunto de datos especificados por la cláusula USING () no tiene valores duplicados de la unirse a columnas , es decir, la columnas en el on () cláusula .

En el ejemplo de OP en la cláusula USING sólo selecciona una clave, que era suficiente con añadir DISTINCT a la cláusula USING. Sin embargo, en el caso general la cláusula USING puede seleccionar una combinación de columnas de clave para que coincida con el y columnas de atributos para ser utilizado en la cláusula FOR UPDATE ... SET. Por lo tanto, en el caso general, la adición de DISTINCT a la cláusula USING todavía permitirá actualizar filas diferentes para las mismas claves, en cuyo caso se seguirá recibiendo el error ORA-30926.

Esta es una elaboración de respuesta y el punto 3.1 del DCookie en la respuesta de Tagar, que a partir de mi experiencia puede no ser evidente de inmediato.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top