#Dica - IF [NOT] EXISTS Uma New Feature do Oracle 23ai

O Oracle 23ai introduziu uma funcionalidade bastante interessante para desenvolvedores e administradores de banco de dados: o suporte à cláusula IF [NOT] EXISTS para comandos DDL. 

Essa nova funcionalidade simplifica operações como criação e exclusão de objetos, reduzindo a necessidade de verificações manuais e evitando erros desnecessários.

Benefícios:

  • Evita erros em comandos DDL: reduz a necessidade de verificar previamente a existência de objetos.
  • Melhora a legibilidade do código: comandos mais claros e concisos.
  • Reduz a necessidade de blocos PL/SQL para verificações.
Antes do Oracle 23ai, a criação de uma tabela exigia verificações manuais, caso contrario você receberia o erro ORA-00955, conforme exemplo abaixo.
SQL>
SQL>
SQL> CREATE TABLE employees (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);  2    3    4

Tabela criada.

SQL> CREATE TABLE employees (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);  2    3    4
CREATE TABLE employees (
             *
ERRO na linha 1:
ORA-00955: nome ja esta sendo usado por um objeto existente

Agora, com a nova funcionalidade, o código se torna muito mais simples e garante que a tabela seja criada apenas se ainda não existir, sem gerar nenhum output de erro caso exista.

Veja o exemplo de criação da tabela usando o comando IF NOT EXISTS.

08:09:13 SQL>
08:09:15 SQL> CREATE TABLE IF NOT EXISTS employees (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);08:09:19   2  08:09:19   3  08:09:19   4

Table created.

08:09:19 SQL> select owner,object_name,object_type,status,to_char(created,'DD-MON-YYYY HH24:MI:SS') created from dba_objects where object_name='EMPLOYEES';

OWNER         OBJECT_NAME             OBJECT_TYPE    STATUS       CREATED
------------- ----------------------- -------------- ------------ -----------------------------
SYS           EMPLOYEES               TABLE          VALID        29-MAR-2025 08:09:19

08:09:26 SQL>
08:09:30 SQL>
08:11:27 SQL> CREATE TABLE IF NOT EXISTS employees (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);08:11:30   2  08:11:30   3  08:11:30   4

Table created.

08:11:31 SQL> select owner,object_name,object_type,status,to_char(created,'DD-MON-YYYY HH24:MI:SS') created from dba_objects where object_name='EMPLOYEES';

OWNER         OBJECT_NAME             OBJECT_TYPE    STATUS       CREATED
------------- ----------------------- -------------- ------------ -----------------------------
SYS           EMPLOYEES               TABLE          VALID        29-MAR-2025 08:09:19

08:11:34 SQL>

Veja que a data de criação da tabela permanece inalterada, ou seja, ela não foi recriada e o comando de create table não apresentou erro.

Além da criação de tabelas esta fetaure pode ser usada na criação de índices, usuários, exclusão ou modificação de objetos. 

Seguem alguns exemplos:

Modificação de Tabelas com ALTER TABLE IF EXIST - Se a tabela employees não existir, o comando será ignorado sem erro.

ALTER TABLE IF EXISTS employees ADD (email VARCHAR2(100));

Da mesma forma, é possível remover colunas com segurança. Isso evita a necessidade de verificações manuais antes de alterar tabelas.

ALTER TABLE IF EXISTS employees DROP COLUMN email;

Exclusão de Objetos com IF EXISTS - Se a tabela não existir, o comando não retorna erro, evitando a necessidade de verificações prévias.

DROP TABLE IF EXISTS employees;

08:26:09 SQL> DESC employees;
ERROR:
ORA-04043: Object employees does not exist.
Help: https://docs.oracle.com/error-help/db/ora-04043/


08:26:15 SQL>  DROP TABLE IF EXISTS employees;

Table dropped.

08:26:19 SQL>

Criação ou remoção de usuários:

08:29:08 SQL> CREATE USER IF NOT EXISTS TESTE IDENTIFIED BY PWDtst##123;

User created.

08:29:09 SQL> DROP USER TESTE IF EXISTS;
DROP USER TESTE IF EXISTS
                *
ERROR at line 1:
ORA-00921: unexpected end of SQL command
Help: https://docs.oracle.com/error-help/db/ora-00921/


08:29:34 SQL> DROP USER IF EXISTS TESTE;

User dropped.


08:29:46 SQL> DROP USER IF EXISTS TESTE;

User dropped.

08:29:47 SQL>

Criação ou remoção de índices:
08:31:40 SQL>
08:31:40 SQL> CREATE INDEX IF NOT EXISTS emp_name_idx ON employees(name);

Index created.


08:31:57 SQL> DROP INDEX IF EXISTS emp_name_idx;

Index dropped.

08:32:08 SQL> 

23ai New Feature - IF [NOT] EXISTS Syntax (Doc ID 3002402.1)

https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/sql-processing-for-application-developers.html#GUID-3818B089-D99D-437C-862F-CBD276BDA3F1

Comentários