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.