Oracle Database не включва IF NOT EXISTS
клауза с нейния CREATE TABLE
изявление, както правят някои други СУБД.
Следователно, ако не искаме да генерираме грешка поради името на таблицата, което вече се използва, трябва да използваме други методи, за да проверим съществуването на таблицата.
Опция 1:Проверете DBA_TABLES
Преглед
DBA_TABLES
е изглед на речник на данни, който описва всички релационни таблици в базата данни. Неговите колони са същите като тези в ALL_TABLES
.
Можем да проверим тази таблица, за да видим дали таблицата вече съществува, след което стартираме само CREATE 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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Резултат:
PL/SQL procedure successfully completed.
В този случай таблицата е създадена, защото няма съществуваща таблица с името t1
.
Сега, ако се опитаме да създадем таблицата отново, ще получим същия изход, който PL/SQL процедурата е завършила успешно и няма да има грешка.
Ако обаче просто се опитаме да създадем таблицата, без първо да проверим за нейното съществуване, получаваме грешка:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Резултат:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Опция 2:Тествайте за грешката
Друг начин да го направите е просто да продължите напред и да стартирате CREATE TABLE
изявление и след това хванете всяка възникнала грешка ORA-00955. По-конкретно, ние улавяме всяка възникнала грешка в SQLCODE -955.
Пример:
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;
Резултат:
PL/SQL procedure successfully completed.
Пуснах това, въпреки че T1
таблицата вече съществуваше. Грешката ORA-00955 беше уловена и обработена, така че не получихме съобщение за грешка и таблицата не беше създадена.
Ако таблицата вече не е съществувала, таблицата щеше да бъде създадена и щяхме да видим същия изход.