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

2 modi per creare una tabella se non esiste già in Oracle

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.