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.