martes, 13 de enero de 2015

Error ORA-30926 durante la sentencia Merge

El error ORA-30926 suele producirse cuando se realizan sentencias MergeEste mensaje de error el cual no da mucho significado se produce cuando en la sentencia Merge se esta tratando de actualizar o ingresar registros a la tabla de destino, sin embargo hay  más de una fila en la tabla origen. Como el motor no sabe qué registro escoger devuelve error. 
El problema es muy parecido al escribir  una subconsulta de una sola fila, pero descubre que es en realidad una subconsulta de múltiples filas cuando se devuelve un error ORA-01422 de Oracle.
Para replicar el caso se explicara bajo el siguiente comando:


MERGE into TABLA_DESTINO TDE
USING TABLA_ORIGEN TOR
ON (TDE.CONCEPTO = TOR.CONCEPTO)
WHEN MATCHED THEN
UPDATE SET TOR.ESTADO = TDE.ESTADO;
SET TOR.ESTADO = TDE.ESTADO;

El comando mostrado actualiza una tabla destino donde por cada concepto tiene un estado diferente. Supongamos que la tabla origen  contenga dos registros con el mismo concepto pero de diferente estado. Con estos datos obtendríamos el siguiente error:


ORA-30926: unable to get a stable set of rows in the source tables.

En estos caso como solución es tratar de variar la forma en que la sentencia merge valida y transacciona los registros de una tabla origen a una tabla destino. Agregando el campo estado en la validación se soluciona este tema. 

MERGE into TABLA_DESTINO TDE
USING TABLA_ORIGEN TOR
ON (TDE.CONCEPTO = TOR.CONCEPTO
and TOR.ESTADO = TDE.ESTADO)
WHEN MATCHED THEN

UPDATE SET TOR.ESTADO = TDE.ESTADO;

También puede agregar un subquery como tabla origen con la finalidad de filtrar los datos que realmente necesita. En otros casos, si no es normal la duplicidad se recomienda revisar la tabla origen por si se presenta errores en la información.

No hay comentarios:

Publicar un comentario