He estado usando el primer ejemplo de código durante años. Aviso no encontrado en lugar de contar.
UPDATE tablename SET val1 = in_val1, val2 = in_val2
WHERE val3 = in_val3;
IF ( sql%notfound ) THEN
INSERT INTO tablename
VALUES (in_val1, in_val2, in_val3);
END IF;
El siguiente código es el código posiblemente nuevo y mejorado
MERGE INTO tablename USING dual ON ( val3 = in_val3 )
WHEN MATCHED THEN UPDATE SET val1 = in_val1, val2 = in_val2
WHEN NOT MATCHED THEN INSERT
VALUES (in_val1, in_val2, in_val3)
En el primer ejemplo, la actualización realiza una búsqueda de índice. Tiene que hacerlo para actualizar la fila derecha. Oracle abre un cursor implícito y lo usamos para ajustar una inserción correspondiente para que sepamos que la inserción solo ocurrirá cuando la clave no exista. Pero la inserción es un comando independiente y tiene que hacer una segunda búsqueda. No conozco el funcionamiento interno del comando merge, pero dado que el comando es una sola unidad, Oracle podría haber ejecutado la inserción o actualización correcta con una sola búsqueda de índice.
Creo que fusionar es mejor cuando hay que procesar algo, lo que significa tomar datos de algunas tablas y actualizar una tabla, posiblemente insertando o eliminando filas. Pero para el caso de una sola fila, puede considerar el primer caso ya que la sintaxis es más común.