Oracle
 sql >> Baza danych >  >> RDS >> Oracle

2 sposoby na utworzenie tabeli, jeśli jeszcze nie istnieje w Oracle

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Poznaj historię zapytań SQL

  2. SQL (ORACLE):ORDER BY i LIMIT

  3. Konwertuj datę ciągu na datę i godzinę w Oracle

  4. Co to jest sekwencja w wyroczni?

  5. Jak mogę zobaczyć zapytania, które są wykonywane w Oracle?