Oracle Database nezahrnuje IF EXISTS
klauzule, kterou některé jiné DBMS nabízejí ve své DROP TABLE
prohlášení. Chceme-li se tedy vyhnout ošklivým chybám vyplývajícím z pokusu o zrušení neexistující tabulky, musíme udělat trochu práce navíc.
Možnost 1:Zkontrolujte, zda tabulka existuje
Můžeme zkontrolovat DBA_TABLES
zobrazení datového slovníku, abyste zjistili, zda tabulka existuje. Tento pohled 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 existuje, a poté spusťte pouze DROP TABLE
prohlášení, pokud ano.
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:='DROP TABLE T1';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Výsledek:
PL/SQL procedure successfully completed.
V tomto případě tabulka nazvaná t1
již existoval a byl zrušen.
Nyní, když spustíme stejný kód znovu, dostaneme stejný výstup:
PL/SQL procedure successfully completed.
Nedošlo k žádné chybě, i když tabulka již neexistuje.
Pokud se však jednoduše pokusíme zrušit tabulku, aniž bychom nejprve zkontrolovali její existenci, dostaneme chybu:
DROP TABLE T1;
Výsledek:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Možnost 2:Test na chybu
Dalším způsobem, jak to udělat, je jednoduše pokračovat a spustit DROP TABLE
a poté zachyťte jakoukoli chybu ORA-00942, která nastane. Konkrétně zachytíme jakoukoli chybu SQLCODE -942, která nastane.
Příklad:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Výsledek:
PL/SQL procedure successfully completed.
Spustil jsem to, i když T1
stůl neexistoval. Chyba ORA-00942 byla zachycena a ošetřena, takže jsme neobdrželi chybovou zprávu.
Pokud by tabulka již existovala, tabulka by byla zrušena a my bychom viděli stejný výstup.