Oracle Database non include il IF NOT EXISTS
clausola con il suo CREATE TABLE
istruzione, come fanno altri DBMS.
Pertanto, se non vogliamo produrre un errore dovuto al nome della tabella già utilizzato, dobbiamo utilizzare altri metodi per verificare l'esistenza della tabella.
Opzione 1:controlla DBA_TABLES
Visualizza
DBA_TABLES
è una vista del dizionario dei dati che 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 già, quindi eseguire solo il CREATE TABLE
dichiarazione se non esiste già.
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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Risultato:
PL/SQL procedure successfully completed.
In questo caso, la tabella è stata creata perché nessuna tabella esistente aveva il nome t1
.
Ora, se proviamo a creare nuovamente la tabella, otterremo lo stesso output che la procedura PL/SQL è stata completata con successo e non ci saranno errori.
Tuttavia, se proviamo semplicemente a creare la tabella senza prima verificarne l'esistenza, otteniamo un errore:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Risultato:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
Opzione 2:verifica dell'errore
Un altro modo per farlo è semplicemente andare avanti ed eseguire CREATE TABLE
istruzione e quindi rilevare qualsiasi errore ORA-00955 che si verifica. In particolare, viene rilevato qualsiasi errore SQLCODE -955 che si verifica.
Esempio:
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;
Risultato:
PL/SQL procedure successfully completed.
L'ho eseguito anche se il T1
la tabella esisteva già. L'errore ORA-00955 è stato rilevato e gestito, quindi non abbiamo ricevuto un messaggio di errore e la tabella non è stata creata.
Se la tabella non fosse già esistita, la tabella sarebbe stata creata e avremmo visto lo stesso output.