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

Resuelto Omnipresent asked hace 14 años • 8 respuestas

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';

Ejecuté table_1que 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?

Omnipresent avatar Feb 26 '10 03:02 Omnipresent
Aceptado

Esto suele deberse a duplicados en la consulta especificada en la cláusula USING. Esto probablemente significa que TABLE_A es una tabla principal y se devuelve el mismo ROWID varias veces.

Podría resolver rápidamente el problema utilizando DISTINCT en su consulta (de hecho, si 'Y' es un valor constante ni siquiera necesita incluirlo en la consulta).

Suponiendo que su consulta sea correcta (no conozco 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';
Pop avatar Feb 25 '2010 20:02 Pop

Probablemente esté intentando actualizar la misma fila de la tabla de destino 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 durante la ejecución de la combinación.

DCookie avatar Feb 25 '2010 20:02 DCookie

Una aclaración adicional sobre el uso de DISTINCT para resolver el error ORA-30926 en el caso general:

Debe asegurarse de que el conjunto de datos especificado por la cláusula USING() no tenga valores duplicados de las columnas de unión , es decir, las columnas de la cláusula ON() .

En el ejemplo de OP donde la cláusula USING solo selecciona una clave, fue suficiente agregar DISTINCT a la cláusula USING. Sin embargo, en el caso general, la cláusula USING puede seleccionar una combinación de columnas clave para hacer coincidir y columnas de atributos que se usarán en la cláusula UPDATE... SET. Por lo tanto, en el caso general, agregar DISTINCT a la cláusula USING seguirá permitiendo diferentes filas de actualización para las mismas claves, en cuyo caso seguirá apareciendo el error ORA-30926.

Esta es una elaboración de la respuesta de DCookie y el punto 3.1 de la respuesta de Tagar, que según mi experiencia puede no ser inmediatamente obvio.

Durban_legend avatar Feb 14 '2019 13:02 Durban_legend

¿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 de configuración 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. Utilice la Nota 122020.1 - Encadenamiento y migración de filas 4.3) Si la tabla además está organizada por índice, consulte: Nota 102932.1 - Monitoreo de filas encadenadas en IOT

Tagar avatar Apr 01 '2016 21:04 Tagar