Oracle Database n'inclut pas le IF EXISTS
clause que certains autres SGBD proposent dans leur DROP TABLE
déclarations. Par conséquent, si nous voulons éviter toute mauvaise erreur résultant de la tentative de suppression d'une table inexistante, nous devons effectuer un peu de travail supplémentaire.
Option 1 :Vérifier si le tableau existe
Nous pouvons vérifier les DBA_TABLES
vue du dictionnaire de données pour voir si la table existe. Cette vue 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, puis exécuter uniquement le DROP TABLE
déclaration si c'est le cas.
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:='DROP TABLE T1';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Résultat :
PL/SQL procedure successfully completed.
Dans ce cas, la table appelée t1
existait déjà et a été supprimée.
Maintenant, si nous exécutons à nouveau le même code, nous obtenons le même résultat :
PL/SQL procedure successfully completed.
Aucune erreur ne s'est produite, même si la table n'existe plus.
Cependant, si nous essayons simplement de supprimer la table sans d'abord vérifier son existence, nous obtenons une erreur :
DROP TABLE T1;
Résultat :
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Option 2 :Tester l'erreur
Une autre façon de le faire est simplement d'aller de l'avant et d'exécuter le DROP TABLE
instruction, puis interceptez toute erreur ORA-00942 qui se produit. Plus précisément, nous interceptons toute erreur SQLCODE -942 qui se produit.
Exemple :
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Résultat :
PL/SQL procedure successfully completed.
J'ai exécuté cela même si le T1
le tableau n'existait pas. L'erreur ORA-00942 a été interceptée et traitée, nous n'avons donc pas reçu de message d'erreur.
Si la table avait déjà existé, la table aurait été supprimée et nous verrions la même sortie.