viernes, 9 de octubre de 2009

Oracle UPSERT

En ocasiones resulta que necesitamos insertar un dato en la tabla si es que no existe ó actualizar (hacer un update) si es que sí existe. La primera solución que se viene a la mente tal vez sea la de:

select count(*) into CNT from where

if CNT = 0 then
insert into ...
else
update ....
end if;

Sin embargo existe otra manera más elegante de hacerlo que nos evita realizar el select-count inicial y se refiere a utilizar el valor de la pseudo-variable SQL%NOTFOUND que es un indicador que nos dice si la última instrucción de Update tuvo o no éxito (si encontró o no registros a modificar).

Utilizando esa propuesta, nuestro código quedaría de esta forma:

UPDATE set = where

if SQL%NOTFOUND then
insert into ...
end if;

Creo que de la forma anterior (sql%notfound) obtenemos un código más limpio y que en caso de tener un update exitoso nos ahorramos también tiempo de ejecución al no tener que hacer un conteo inicial.

Existe también otra posible solución que es la de utilizar la sentencia MERGE pero hablaremos de ella en otro post en un par de días.

No hay comentarios.: