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