Baza danych Oracle nie zawiera IF EXISTS
klauzula, którą niektóre inne DBMS oferują w ich DROP TABLE
sprawozdania. Dlatego jeśli chcemy uniknąć nieprzyjemnych błędów wynikających z próby usunięcia nieistniejącej tabeli, musimy wykonać trochę dodatkowej pracy.
Opcja 1:Sprawdź, czy tabela istnieje
Możemy sprawdzić DBA_TABLES
widok słownika danych, aby sprawdzić, czy tabela istnieje. Ten widok opisuje wszystkie tabele relacyjne w bazie danych. Jego kolumny są takie same jak w ALL_TABLES
.
Możemy sprawdzić tę tabelę, aby zobaczyć, czy istnieje, a następnie uruchomić tylko DROP TABLE
oświadczenie, jeśli tak.
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:='DROP TABLE T1';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Wynik:
PL/SQL procedure successfully completed.
W tym przypadku tabela o nazwie t1
już istniał i został usunięty.
Teraz, jeśli ponownie uruchomimy ten sam kod, otrzymamy to samo wyjście:
PL/SQL procedure successfully completed.
Nie wystąpił błąd, mimo że tabela już nie istnieje.
Jeśli jednak po prostu spróbujemy usunąć tabelę bez uprzedniego sprawdzenia jej istnienia, otrzymamy błąd:
DROP TABLE T1;
Wynik:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Opcja 2:Test pod kątem błędu
Innym sposobem na to jest po prostu uruchomienie DROP TABLE
instrukcji, a następnie przechwyć występujący błąd ORA-00942. W szczególności wyłapujemy każdy błąd SQLCODE -942, który wystąpi.
Przykład:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Wynik:
PL/SQL procedure successfully completed.
Uruchomiłem to, mimo że T1
tabela nie istniała. Błąd ORA-00942 został wykryty i obsłużony, więc nie otrzymaliśmy komunikatu o błędzie.
Gdyby tabela już istniała, zostałaby usunięta i zobaczylibyśmy to samo wyjście.