sql >> Databáze >  >> RDS >> Oracle

2 způsoby, jak vytvořit tabulku, pokud v Oracle ještě neexistuje

Oracle Database nezahrnuje IF NOT EXISTS klauzule s její CREATE TABLE jako některé jiné DBMS.

Pokud tedy nechceme způsobit chybu kvůli již použitému názvu tabulky, musíme pro kontrolu existence tabulky použít jiné metody.

Možnost 1:Zkontrolujte DBA_TABLES Zobrazit

DBA_TABLES je pohled datového slovníku, který popisuje všechny relační tabulky v databázi. Jeho sloupce jsou stejné jako sloupce v ALL_TABLES .

Můžeme zkontrolovat tuto tabulku, abychom zjistili, zda tabulka již existuje, a poté spusťte pouze CREATE TABLE prohlášení, pokud již neexistuje.

Příklad:

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;

Výsledek:

PL/SQL procedure successfully completed.

V tomto případě byla tabulka vytvořena, protože žádná existující tabulka neměla název t1 .

Nyní, když se pokusíme vytvořit tabulku znovu, dostaneme stejný výstup, jaký úspěšně dokončila procedura PL/SQL, a nedojde k žádné chybě.

Pokud se však jednoduše pokusíme vytvořit tabulku bez předchozí kontroly její existence, dostaneme chybu:

CREATE TABLE T1 (
    c1 number(6,0),
    c2 varchar2(10)
);

Výsledek:

Error report -
ORA-00955: name is already used by an existing object
00955. 00000 -  "name is already used by an existing object"

Možnost 2:Testování chyby

Dalším způsobem, jak to udělat, je jednoduše pokračovat a spustit CREATE TABLE a poté zachyťte jakoukoli chybu ORA-00955, která nastane. Konkrétně zachytíme jakoukoli chybu SQLCODE -955, která nastane.

Příklad:

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;

Výsledek:

PL/SQL procedure successfully completed.

Spustil jsem to, i když T1 tabulka již existovala. Chyba ORA-00955 byla zachycena a ošetřena, takže jsme neobdrželi chybovou zprávu a tabulka nebyla vytvořena.

Pokud by tabulka ještě neexistovala, byla by vytvořena a my bychom viděli stejný výstup.


  1. Jak TIME() funguje v MariaDB

  2. Aktualizujte více hodnot sloupců tabulky pomocí jednoho dotazu

  3. Volání nedefinované funkce oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6

  4. Jak vypustit sloupec v SQL?