Oracle
 sql >> Base de données >  >> RDS >> Oracle

2 façons de créer une table si elle n'existe pas déjà dans Oracle

Oracle Database n'inclut pas le IF NOT EXISTS clause avec son CREATE TABLE déclaration, comme le font certains autres SGBD.

Par conséquent, si nous ne voulons pas produire d'erreur en raison du nom de table déjà utilisé, nous devons utiliser d'autres méthodes pour vérifier l'existence de la table.

Option 1 :Vérifiez les DBA_TABLES Afficher

DBA_TABLES est une vue de dictionnaire de données qui décrit toutes les tables relationnelles de la base de données. Ses colonnes sont les mêmes que celles de ALL_TABLES .

Nous pouvons vérifier cette table pour voir si la table existe déjà, puis exécuter uniquement le CREATE TABLE déclaration si elle n'existe pas déjà.

Exemple :

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;

Résultat :

PL/SQL procedure successfully completed.

Dans ce cas, la table a été créée car aucune table existante ne portait le nom t1 .

Maintenant, si nous essayons de recréer la table, nous obtiendrons la même sortie que la procédure PL/SQL terminée avec succès, et il n'y aura pas d'erreur.

Cependant, si nous essayons simplement de créer la table sans d'abord vérifier son existence, nous obtenons une erreur :

CREATE TABLE T1 (
    c1 number(6,0),
    c2 varchar2(10)
);

Résultat :

Error report -
ORA-00955: name is already used by an existing object
00955. 00000 -  "name is already used by an existing object"

Option 2 : Tester l'erreur

Une autre façon de le faire est simplement d'aller de l'avant et d'exécuter le CREATE TABLE instruction, puis interceptez toute erreur ORA-00955 qui se produit. Plus précisément, nous interceptons toute erreur SQLCODE -955 qui se produit.

Exemple :

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;

Résultat :

PL/SQL procedure successfully completed.

J'ai exécuté cela même si le T1 tableau existait déjà. L'erreur ORA-00955 a été détectée et traitée, nous n'avons donc pas reçu de message d'erreur et la table n'a pas été créée.

Si le tableau n'existait pas déjà, le tableau aurait été créé et nous verrions le même résultat.