DELETE en SQL Oracle : Syntaxe et Exemples Pratiques

Maîtrisez la commande DELETE en SQL Oracle : syntaxe complète, exemples métier concrets, erreurs courantes et bonnes pratiques pour supprimer vos données efficacement.

Illustration du tutoriel SQL Oracle : DELETE en SQL Oracle : Syntaxe et Exemples Pratiques

Publicité

🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.

La commande DELETE en SQL Oracle : Guide complet avec exemples

La commande DELETE en SQL Oracle est une instruction fondamentale du langage de manipulation de données (DML) qui permet de supprimer une ou plusieurs lignes d’une table. Que vous travailliez sur une application métier, un entrepôt de données ou un projet de migration, maîtriser DELETE en SQL Oracle est indispensable pour maintenir l’intégrité et la cohérence de vos bases de données.

Définition et utilisation de DELETE en SQL Oracle

La commande DELETE appartient à la catégorie des instructions DML (Data Manipulation Language). Elle permet de supprimer des enregistrements existants dans une table, contrairement à DROP qui supprime la table entière, ou à TRUNCATE qui vide une table sans possibilité de rollback granulaire.

En entreprise, DELETE est utilisé dans de nombreux contextes :

  • Nettoyage de données : suppression d’enregistrements obsolètes ou invalides.
  • Gestion du cycle de vie : archivage et purge des données anciennes (commandes de plus de 5 ans, logs expirés, etc.).
  • Correction d’erreurs : suppression de doublons ou de lignes insérées par erreur.
  • Respect du RGPD : effacement des données personnelles à la demande d’un utilisateur.

Un avantage majeur de DELETE par rapport à TRUNCATE est qu’il est transactionnel : les suppressions peuvent être annulées avec un ROLLBACK tant que la transaction n’a pas été validée par un COMMIT.

Syntaxe complète de DELETE en SQL Oracle

La syntaxe de base de la commande DELETE en Oracle est la suivante :

DELETE [FROM] nom_table
[WHERE condition]
[RETURNING colonne INTO variable];

Explication des paramètres

  • FROM (optionnel) : mot-clé facultatif en Oracle, mais recommandé pour la lisibilité et la compatibilité.
  • nom_table : nom de la table (ou vue) dans laquelle les suppressions doivent être effectuées.
  • WHERE condition : clause fortement recommandée. Sans elle, toutes les lignes de la table seront supprimées. La condition peut inclure des sous-requêtes, des opérateurs IN, EXISTS, des jointures via sous-requêtes, etc.
  • RETURNING ... INTO (optionnel, spécifique Oracle) : permet de récupérer les valeurs des colonnes des lignes supprimées dans des variables PL/SQL, utile dans les blocs procéduraux.

⚠️ Attention : En Oracle, DELETE sans clause WHERE supprime toutes les lignes de la table. Elle est différente de TRUNCATE car elle génère des undo logs et peut être annulée, mais elle peut être très coûteuse sur de grandes tables.

Exemples pratiques de DELETE en SQL Oracle

Exemple 1 – Supprimer des commandes annulées d’une table de gestion commerciale

Contexte métier : Dans une application de gestion commerciale, la table COMMANDES contient des commandes avec différents statuts. Le service informatique doit purger toutes les commandes ayant le statut 'ANNULEE' et datant de plus de deux ans, afin d’alléger la base de données.

-- Suppression des commandes annulées de plus de 2 ans
-- dans la table COMMANDES

DELETE FROM commandes
WHERE statut = 'ANNULEE'
  AND date_commande < ADD_MONTHS(SYSDATE, -24);

-- Validation de la transaction
COMMIT;

Explication :

  • statut = 'ANNULEE' : filtre sur le statut de la commande.
  • ADD_MONTHS(SYSDATE, -24) : fonction Oracle qui retourne la date d’il y a 24 mois. Toutes les commandes antérieures à cette date seront supprimées.
  • COMMIT : valide définitivement la suppression. Sans ce COMMIT, un ROLLBACK permettrait d’annuler l’opération.

Exemple 2 – Supprimer des enregistrements en utilisant une sous-requête

Contexte métier : Dans une application RH, on souhaite supprimer les évaluations annuelles des employés qui ont quitté l’entreprise (présents dans la table EMPLOYES_ARCHIVES).

-- Suppression des évaluations des employés archivés (ayant quitté l'entreprise)
-- en utilisant une sous-requête avec EXISTS

DELETE FROM evaluations e
WHERE EXISTS (
    SELECT 1
    FROM employes_archives ea
    WHERE ea.employe_id = e.employe_id
);

-- Vérification du nombre de lignes supprimées avant validation
-- SQL%ROWCOUNT est disponible en PL/SQL
-- Ici on valide directement
COMMIT;

Explication :

  • EXISTS (SELECT 1 FROM ...) : sous-requête corrélée qui vérifie l’existence d’une correspondance dans EMPLOYES_ARCHIVES. C’est une approche très performante en Oracle pour les suppressions conditionnelles liées à une autre table.
  • L’alias e sur la table principale permet d’établir le lien avec la sous-requête.
  • Cette syntaxe est préférable à un IN sur de grands volumes de données, car EXISTS s’arrête dès qu’une correspondance est trouvée.
Publicité

Erreurs courantes avec DELETE en SQL Oracle

Erreur : ORA-02292 – Violation de contrainte d’intégrité (enregistrement fils existant)

Cette erreur est l’une des plus fréquentes lors de l’utilisation de DELETE en Oracle.

-- Tentative de suppression d'un client ayant des commandes associées
DELETE FROM clients
WHERE client_id = 1042;

-- Résultat :
-- ORA-02292: violation of integrity constraint (SCHEMA.FK_COMMANDES_CLIENTS)
-- - child record found

Cause : La table CLIENTS est référencée par la table COMMANDES via une clé étrangère (FOREIGN KEY). Oracle interdit la suppression du client tant qu’il existe des commandes associées, afin de préserver l’intégrité référentielle.

Solutions :

  • Supprimer d’abord les enregistrements fils (commandes liées) avant de supprimer le client parent.
  • Utiliser une contrainte avec ON DELETE CASCADE lors de la création de la clé étrangère, ce qui supprime automatiquement les lignes filles.
  • Vérifier les dépendances avec le dictionnaire Oracle : ALL_CONSTRAINTS et ALL_CONS_COLUMNS.
-- Solution : supprimer d'abord les commandes liées, puis le client
DELETE FROM commandes WHERE client_id = 1042;
DELETE FROM clients  WHERE client_id = 1042;
COMMIT;

Résumé

Point cléDétail
CatégorieDML (Data Manipulation Language)
RôleSupprimer une ou plusieurs lignes d’une table
Clause WHEREFortement recommandée – sans elle, toutes les lignes sont supprimées
TransactionnelOui – compatible COMMIT / ROLLBACK
Différence avec TRUNCATETRUNCATE est plus rapide mais non annulable ligne par ligne
Clause RETURNINGSpécifique Oracle – récupère les valeurs supprimées en PL/SQL
Erreur fréquenteORA-02292 : violation de contrainte d’intégrité référentielle
PerformancePréférer EXISTS à IN pour les sous-requêtes volumineuses

Bonnes pratiques Oracle

  1. Toujours tester avec un SELECT avant de DELETE : Avant d’exécuter votre instruction DELETE, remplacez-la temporairement par un SELECT COUNT(*) avec la même clause WHERE pour vérifier le nombre de lignes concernées et éviter les suppressions involontaires.
  2. Travailler en transactions explicites : En environnement de production, ouvrez une transaction explicite, exécutez votre DELETE, vérifiez le résultat (notamment via SQL%ROWCOUNT en PL/SQL), puis validez avec COMMIT ou annulez avec ROLLBACK selon le résultat obtenu.

Aller plus loin

Pour approfondir vos connaissances sur la manipulation des données en SQL Oracle, voici trois sujets complémentaires qui vous permettront de progresser :

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité