Baza danych Oracle nie zawiera IF NOT EXISTS
klauzula z jej CREATE TABLE
oświadczenie, jak robią to niektóre inne DBMS.
Dlatego, jeśli nie chcemy powodować błędu z powodu już używanej nazwy tabeli, musimy użyć innych metod, aby sprawdzić istnienie tabeli.
Opcja 1:Sprawdź DBA_TABLES
Zobacz
DBA_TABLES
to widok słownika danych, który opisuje wszystkie relacyjne tabele w bazie danych. Jego kolumny są takie same jak w ALL_TABLES
.
Możemy sprawdzić tę tabelę, aby zobaczyć, czy tabela już istnieje, a następnie uruchomić tylko CREATE TABLE
oświadczenie, jeśli jeszcze nie istnieje.
Przykład:
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;
Wynik:
PL/SQL procedure successfully completed.
W tym przypadku tabela została utworzona, ponieważ żadna istniejąca tabela nie miała nazwy t1
.
Teraz, jeśli spróbujemy ponownie utworzyć tabelę, otrzymamy te same dane wyjściowe, które pomyślnie zakończyła procedura PL/SQL, i nie będzie żadnego błędu.
Jeśli jednak po prostu spróbujemy utworzyć tabelę bez uprzedniego sprawdzenia jej istnienia, otrzymamy błąd:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Wynik:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Opcja 2:Przetestuj błąd
Innym sposobem na to jest po prostu uruchomienie CREATE TABLE
instrukcji, a następnie przechwyć każdy występujący błąd ORA-00955. W szczególności wyłapujemy każdy błąd SQLCODE -955, który się pojawi.
Przykład:
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;
Wynik:
PL/SQL procedure successfully completed.
Uruchomiłem to, mimo że T1
tabela już istniała. Błąd ORA-00955 został przechwycony i obsłużony, więc nie otrzymaliśmy komunikatu o błędzie, a tabela nie została utworzona.
Gdyby tabela jeszcze nie istniała, zostałaby utworzona i zobaczylibyśmy to samo wyjście.