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
Postar um comentário