Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle DROP TABLE SE ESISTE Alternative

Oracle Database non include IF EXISTS clausola che alcuni altri DBMS offrono nel loro DROP TABLE dichiarazioni. Pertanto, se vogliamo evitare brutti errori derivanti dal tentativo di eliminare una tabella inesistente, dobbiamo fare un po' di lavoro in più.

Opzione 1:verifica se la tabella esiste

Possiamo controllare il DBA_TABLES vista dizionario dati per vedere se la tabella esiste. Questa vista descrive tutte le tabelle relazionali nel database. Le sue colonne sono le stesse di ALL_TABLES .

Possiamo controllare questa tabella per vedere se la tabella esiste, quindi eseguire solo il DROP TABLE dichiarazione se lo fa.

Esempio:

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;

Risultato:

PL/SQL procedure successfully completed.

In questo caso, la tabella denominata t1 esisteva già ed è stato abbandonato.

Ora, se eseguiamo di nuovo lo stesso codice, otteniamo lo stesso output:

PL/SQL procedure successfully completed.

Non si è verificato alcun errore, anche se la tabella non esiste più.

Tuttavia, se proviamo semplicemente a eliminare la tabella senza prima verificarne l'esistenza, otteniamo un errore:

DROP TABLE T1;

Risultato:

Error report -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"

Opzione 2:verifica l'errore

Un altro modo per farlo è semplicemente andare avanti ed eseguire il DROP TABLE istruzione e quindi rilevare qualsiasi errore ORA-00942 che si verifica. In particolare, viene rilevato qualsiasi errore SQLCODE -942 che si verifica.

Esempio:

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;

Risultato:

PL/SQL procedure successfully completed.

L'ho eseguito anche se il T1 il tavolo non esisteva. L'errore ORA-00942 è stato rilevato e gestito, quindi non abbiamo ricevuto un messaggio di errore.

Se la tabella fosse già esistita, la tabella sarebbe stata eliminata e avremmo visto lo stesso output.