2010-02-25 30 views
94

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

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 corrió table_1 tiene datos y también he corrió la consulta en el interior (src) que también tiene datos.

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

Respuesta

145

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 rápidamente el problema utilizando DISTINCT en su consulta (de hecho, si 'Y' es un valor constante, ni siquiera necesita 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'; 
+0

10x Nice answer. Me ayudó –

+0

De mí también .. directamente en la cabeza – TonyP

+1

Esta es probablemente la razón por la que otros enfoques (para mí) también me devolvieron otros errores (como 'procedimiento, función, paquete o tipo no está permitido aquí' y 'No se puede modificar columna que se correlaciona con un error de tabla no preservado por clave al intentar insertar en una vista '). ~ Si ayuda a alguien más, recibí el mismo error incluso después de agregar distinto hasta que reordené las combinaciones de mi consulta interna, así que comencé con la tabla que recibía más de una fila y se unió desde allí ... Si eso tiene sentido. – jinglesthula

33

Probablemente esté tratando de 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 en la ejecución de la fusión.

+0

+1, gracias, esto me acaba de ocurrir en una tabla de objetivos con un pequeño número de duplicados (al menos en función de las claves utilizadas en la fusión). – tbone

2

Resolución de problemas en ORA-30926 Errores? (Doc ID 471956,1)

1) Identificar la sentencia anómala

conjunto sesión alter ‘30926 traza nivel de nombre errorstack 3’ eventos;

o

sistema alter establece eventos ‘nombre 30,926 traza errorstack off’;

y mire si hay archivos .trc en UDUMP cuando esto ocurra.

2) Después de encontrar la instrucción SQL, verifique si es correcta (tal vez usando Explain Plan 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úa los datos devueltos por la cláusula USING para garantizar que no haya valores duplicados en la unión. Modificar la instrucció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 llenar el resultado de la vista en una tabla e intente actualizar la tabla directamente.

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

3.4) ¿La instrucció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". Consulte el error 2681037

3.5) ¿La tabla tiene 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 instrucción '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 FILA ENCADENADA o migrada en la mesa. Hay formas de minimizar esto, como la configuración correcta de PCTFREE. Menciones 122.020,1 - Fila de encadenamiento y Migración 4.3) Si la tabla es, además Índice organizado, ver: Nota 102932.1 - Seguimiento filas encadenadas en IOT

3

tenido el error de hoy en un 12c y ninguna de las respuestas existentes ajuste (sin duplicados, sin 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 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 tiempo real con muchos usuarios simultáneos. 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. Así que la solución se encuentra en la acción sugerida del mensaje:

Acción: elimine las cláusulas no deterministas dónde y vuelva a emitir la LMD.

+0

Recibí ese mensaje de error haciendo una importación de DataPump a través de la red (usando el parámetro 'NETWORK_LINK' que se conecta directamente a la base de datos de origen) durante la etapa de recopilación de estadísticas, y su nota resaltada probablemente lo explica. Afortunadamente solo las estadísticas se vieron afectadas. –

Cuestiones relacionadas