Documente Academic
Documente Profesional
Documente Cultură
Anteriormente a la versión 9i de Oracle, la alternativa en SQL era ejecutar dos sentencias DML,
unUPDATE y un INSERT, cada una utilizando condiciones lógicas opuestas. En cuanto a las
alternativas en PL/SQL eran: bien intentar insertar un registro y si la sentencia INSERT fallaba
debido a una excepcion PLSQL del tipo DUP_VAL_ON_INDEX, entonces realizar
unUPDATEUPDATE devolvía SQL%NOTFOUND, entonces ejecutar la correspondiente
sentenciaINSERT.
- Permite con una misma sentencia realizar un UPDATE si el registro existe, o un INSERT si se
trata de un nuevo registro.
- El rendimiento de la base de datos mejora ya que, al necesitarse menos sentencias SQL para
realizar las mismas operaciones, también se necesitan menos accesos a las tablas fuente.
En el presente ejemplo voy a partir del hecho de que tenemos dos tablas en un data warehouse,
una de ellas con muchos registros denominada clientes y otra más pequeña denominada
datos_cli cuyos registros deben insertarse en la tabla clientes. En pocas palabras, estoy
suponiendo que la tabla datos_cli contiene los cambios a realizar sobre la tabla clientes. La
sentencia SQL MERGE que debemos utilizar para actualizar la tabla cliente podría ser la siguiente:
Una cláusula INTO, que especifica la tabla destino donde los registros serán actualizados o
insertados.
Una cláusula USING, especificando el origen de los datos que van a ser insertados o que van a
servir para actualizar la tabla destino. El origen de los datos puede tratarse de una tabla, una vista,
o del resultado de la ejecución de una consulta SELECT.
Las cláusulas WHEN MATCHED | NOT MATCHED, que son las que indican a la base de datos
Oracle que acción realizar si se cumple o no se cumple la condición del ON. Estas dos cláusulas se
pueden poner en cualquier orden.
GE
Con Oracle 9i se introduce la expresión MERGE. Hasta ese momento, cuando se quería insertar/actualizar
datos en una tabla no vacía, había que revisar si el registro ya existía para aplicar INSERT o UPDATE,
manejándolo proceduralmente, por ejemplo PL/SQL. Con MERGE, podemos tener esta lógica en una única
sentencia SQL, simplificando el código y obteniendo un mejor rendimiento.
En Oracle 10g se introducen mejoras, de modo que puede hacerse sólo el Update (sin poner claúsula "WHEN
NOT MATCHED") y viceversa (indicar sólo el Insert, obviando la claúsula "WHEN MATCHED"), además de
incluir la posibilidad de poner una sentencia DELETE justo después del UPDATE para borrar las filas del
"MATCH" que cumplan una determinada condición.
Ejemplos:
-- Con Update cuando la fila existe, e Insert cuando no
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHERE b.status != 'VALID'
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status)
WHERE b.status != 'VALID';
http://psoug.org/reference/merge.html