Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

2 maneiras de criar uma tabela se ela ainda não existir no Oracle


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.