Como vimos en el artículo anterior, se puede evitar que una sentencia de DML aborte su ejecución en caso de errores mediante el uso de la cláusula LOG ERRORS.  Lo que veremos a continuación es cómo obtener un comportamiento similar mediante el uso de la opción SAVE EXCEPTIONS de FORALL.

 

Construyendo el ambiente para las pruebas

El primer paso consiste en construir un ambiente de pruebas con algunas tablas donde podamos probar las distintas formas que Oracle provee para capturar errores en una sentencia de tipo DML sin abortar la ejecución de la misma, para lo cual utilizaremos el mismo script que en el artículo anterior, obteniendo estos resultados:

 

 

 

En este artículo nos vamos a saltear la generación de los errores, como hicimos en los UPDATE del artículo anterior, viendo directamente de qué forma podemos usar BULK COLLECT y FORALL con SAVE EXCEPTIONS para detectar errores y no abortar la ejecución de la sentencia DML

 

Usando SAVE EXCEPTIONS

Esta cláusula nos permite guardar las excepciones detectadas en operaciones de DML ejecutadas con FORALL. La sintaxis es la siguiente:

 

 

Al utilizar la clausula SAVE EXCEPTIONS, Oracle guarda las mismas y podemos continuar ejecutando las operaciones de DML, accediendo posteriormente a las excepciones encontradas para mostrar o loguear las mismas.

 

Vamos a utilizar el siguiente script para actualizar la tabla tActualizame en forma similar a como lo hicimos con UPDATE ... LOG ERRORS, pero usando FORALL y SAVE EXCEPTIONS.

 

Al ejecutar el script, obtenemos el siguiente resultado:

 

 

 

Como habrán visto en el script, la sintaxis es mas complicada, ya que estamos leyendo los datos de la tabla, almacenando la version deseada en una colección y luego actualizando la tabla con los datos de la colección.

 

La ventaja de este enfoque es que el mismo permite continuar la operación cuando el error se debe a una clave duplicada, lo cual podemos comprobar con el siguiente script, el cual genera este resultado:

 

 

La desventaja de este enfoque que utiliza PL/SQL en este caso está en la performance, ya que los tiempos de ejecución promedio de las operaciones DML usando solo SQL, como vimos en el artículo anterior, se mantenían en torno a 1.2 segundos, mientras que las pruebas con BILK COLLECT y FORALL ... SAVE EXCEPTIONS dieron resultados superiores a los 3 segundos (aunque permitieron capturar errores de clave duplicada).