martes, 5 de marzo de 2013

MERGE en ORACLE


Se utiliza para seleccionar filas de una o más fuentes de actualización o inserción en una tabla o vista. Puede especificar condiciones para determinar valores para actualizar o insertar en la tabla o vista.

Esta declaración es una manera conveniente de combinar múltiples operaciones. Esto le permite evitar múltiples INSERT, ACTUALIZAR y ELIMINAR DML.
MERGE es una afirmación determinista. No se puede actualizar la misma fila de la tabla de destino varias veces en el mismo MERGE comunicado.

La sintáxis de MERGE está pensada para que la fuente de datos que se va a insertar sea una tabla o una consulta, de esta manera:

MERGE INTO [tabla_destino]
USING ([tabla o vista o consulta])
ON ([condición de existencia de registro])
WHEN MATCHED THEN [sentencia de actualización]
WHEN NOT MATCHED THEN [sentencia de inserción];

A veces en que los datos a incorporar no provienen de ninguna tabla, sino que se trata de un único registro enviado por una aplicación (por ejemplo a través de parámetros). Una forma de poder aprovechar la sentencia MERGE en estos casos, es construir una consulta sobre la tabla DUAL que convenientemente contiene una única fila.

Partiendo de una tabla tabla_destino, donde queremos hacer la actualización de datos:
CREATE TABLE tabla_destino (a int, b varchar2(10));
Si:
              Nuestro registro a insertar es {param_a, param_b}
              La condición de que el registro exista es la columna a
              Lo que queremos actualizar en caso que el registro exista es la columna b.

Entonces usamos MERGE así:

MERGE INTO tabla_destino td
USING (SELECT param_a a FROM dual) d
ON (td.a = d.a)
WHEN MATCHED THEN UPDATE SET td.b = param_b
WHEN NOT MATCHED THEN INSERT (td.a, td.b) VALUES (param_a, param_b);

En la línea 2 (USING) seleccionamos el registro que participa en la condición que el registro exista.

En la línea 3 especificamos cual es la condición que se considera que el registro ya existe
Las líneas 4 y 5 actualizan o insertan el registro.

Una forma simplificada y equivalente es la siguiente:

MERGE INTO tabla_destino td
USING dual d
ON (td.a = param_a)
WHEN MATCHED THEN UPDATE SET td.b = param_b
WHEN NOT MATCHED THEN INSERT (td.a, td.b) VALUES (param_a, param_b);

Se recomienda el uso de MERGE ya que es una única sentencia SQL y naturalmente está optimizada por el motor. Hay excepciones como es el caso de cargas masivas de datos con millones de registros donde la performance de MERGE se degrada. Allí existen otras alternativas más eficientes.

grupodivisoft.com

No hay comentarios:

Publicar un comentario