miércoles, 19 de abril de 2023

Oracle 23c - IF [NOT] EXISTS en Sentencias DDL


En este artículo vamos a analizar otra nueva característica de Oracle Database 23c que permite generar scripts de creación o eliminación de objetos más robustos y sencillos.

El Problema

En más de una ocasión nos encontramos en la situación de tener que ejecutar un script de creación de objetos y no estar seguros si el mismo ya fue ejecutado previamente en la base de datos. De ser así, es probable que todas o muchas de las sentencias CREATE del mismo den un error (al ya existir el objeto que se desea crear). Similar escenario se da en el caso opuesto, cuando tenemos un script para eliminar objetos pero alguno de ellos ya fue eliminado o directamente nunca fue creado.

Por ejemplo, veamos qué ocurriría si queremos volver a probar el script que usamos en el artículo "Oracle 23c - Privilegios de Esquema" para crear usuarios en la nuestra base de datos:

CREATE USER Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users;
Automáticamente veremos el siguiente error:


IF [NOT] EXIST en sentencias de tipo DDL

Esta cláusula evita que las sentencias de creación, actualización o eliminación de objetos den error en caso que los mismos ya existan (creación) o no existan (actualización o eliminación), como podemos ver a continuación:

CREATE USER IF NOT EXISTS Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users;

Utilizando SQL Developer para ejecutar esta sentencia, el mensaje que recibimos es que el usuario IF ha sido creado (lo cual no es así) pero lo importante es que la sentencia no genera un error:

User IF creado.

La decisión de mostrar que el objeto ha sido creado es para mantener el mismo comportamiento cuando el objeto no existe y es creado que cuando ya existe, en el caso que se utilice pruebas de regresión para analizar el resultado del script.


Eliminando Objetos Inexistentes

Así como evitamos error al intentar crear un objeto existente con IF NOT EXISTS, lo mismo podemos probar si queremos eliminar objetos que no existen, usando la cláusula sin la palabra clave IF EXISTS, como vemos a continuación:

DROP TABLE Ventas.NoExiste;
DROP TABLE IF EXISTS Ventas.NoExiste;

Al ejecutar ambas sentencias, vemos que la primera genera un error ya que la tabla no existe, mientras que la segunda no genera el error:


Nuevamente, hasta que no se actualice SQL Developer, el mensaje muestra "IF" como nombre de objeto involucrado cuando debería ser el nombre real del mismo el que se muestre.


Conclusión

Oracle Database 23c ofrece la clausula IF [NOT] EXISTS en sentencias DDL para preparar scripts de creación de objetos que evita errores y hace más simples los mismos.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


No hay comentarios.:

Publicar un comentario