Oracle Database не включва IF EXISTS
клауза, която някои други СУБД предлагат в своя DROP TABLE
изявления. Ето защо, ако искаме да избегнем неприятни грешки, произтичащи от опит за премахване на несъществуваща таблица, трябва да свършим малко допълнителна работа.
Опция 1:Проверете дали таблицата съществува
Можем да проверим DBA_TABLES
изглед на речник на данни, за да видите дали таблицата съществува. Този изглед описва всички релационни таблици в базата данни. Неговите колони са същите като тези в ALL_TABLES
.
Можем да проверим тази таблица, за да видим дали таблицата съществува, след което стартираме само DROP TABLE
изявление, ако е така.
Пример:
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;
Резултат:
PL/SQL procedure successfully completed.
В този случай таблицата, наречена t1
вече съществуваше и беше премахнато.
Сега, ако изпълним отново същия код, получаваме същия изход:
PL/SQL procedure successfully completed.
Не е възникнала грешка, въпреки че таблицата вече не съществува.
Ако обаче просто се опитаме да пуснем таблицата, без първо да проверим за нейното съществуване, получаваме грешка:
DROP TABLE T1;
Резултат:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Опция 2:Тествайте за грешката
Друг начин да го направите е просто да продължите напред и да стартирате DROP TABLE
изявление и след това хванете всяка възникнала грешка ORA-00942. По-конкретно, ние улавяме всяка възникнала грешка в SQLCODE -942.
Пример:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Резултат:
PL/SQL procedure successfully completed.
Пуснах това, въпреки че T1
маса не съществуваше. Грешката ORA-00942 беше уловена и обработена, така че не получихме съобщение за грешка.
Ако таблицата вече е съществувала, таблицата щеше да бъде премахната и щяхме да видим същия изход.