O Oracle Database não inclui o
IF NOT EXISTS
cláusula com seu CREATE TABLE
instrução, como alguns outros DBMSs fazem. Portanto, se não quisermos produzir um erro devido ao nome da tabela já estar sendo usado, precisamos usar outros métodos para verificar a existência da tabela.
Opção 1:verifique o DBA_TABLES
Visualizar
DBA_TABLES
é uma visão de dicionário de dados que descreve todas as tabelas relacionais no banco de dados. Suas colunas são as mesmas de ALL_TABLES
. Podemos verificar esta tabela para ver se a tabela já existe, então apenas execute o
CREATE TABLE
declaração se ela ainda não existir. Exemplo:
DECLARE
tbl_count number;
sql_stmt long;
BEGIN
SELECT COUNT(*) INTO tbl_count
FROM dba_tables
WHERE owner = 'HR'
AND table_name = 'T1';
IF(tbl_count <= 0)
THEN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Resultado:
PL/SQL procedure successfully completed.
Neste caso, a tabela foi criada porque nenhuma tabela existente tinha o nome
t1
. Agora, se tentarmos criar a tabela novamente, obteremos a mesma saída que o procedimento PL/SQL concluiu com sucesso e não haverá erro.
No entanto, se simplesmente tentarmos criar a tabela sem primeiro verificar sua existência, obteremos um erro:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Resultado:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Opção 2:testar o erro
Outra maneira de fazer isso é simplesmente executar o comando
CREATE TABLE
instrução e, em seguida, capturar qualquer erro ORA-00955 que ocorrer. Especificamente, detectamos qualquer erro SQLCODE -955 que ocorra. Exemplo:
DECLARE
sql_stmt long;
BEGIN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL;
ELSE
RAISE;
END IF;
END;
Resultado:
PL/SQL procedure successfully completed.
Eu executei isso mesmo que o
T1
mesa já existia. O erro ORA-00955 foi capturado e tratado para não recebermos uma mensagem de erro e a tabela não foi criada. Se a tabela ainda não existisse, a tabela teria sido criada e veríamos a mesma saída.