
🧪 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érateursIN,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,
DELETEsans clauseWHEREsupprime toutes les lignes de la table. Elle est différente deTRUNCATEcar 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 ceCOMMIT, unROLLBACKpermettrait 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 dansEMPLOYES_ARCHIVES. C’est une approche très performante en Oracle pour les suppressions conditionnelles liées à une autre table.- L’alias
esur la table principale permet d’établir le lien avec la sous-requête. - Cette syntaxe est préférable à un
INsur de grands volumes de données, carEXISTSs’arrête dès qu’une correspondance est trouvée.
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 CASCADElors 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_CONSTRAINTSetALL_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égorie | DML (Data Manipulation Language) |
| Rôle | Supprimer une ou plusieurs lignes d’une table |
| Clause WHERE | Fortement recommandée – sans elle, toutes les lignes sont supprimées |
| Transactionnel | Oui – compatible COMMIT / ROLLBACK |
| Différence avec TRUNCATE | TRUNCATE est plus rapide mais non annulable ligne par ligne |
| Clause RETURNING | Spécifique Oracle – récupère les valeurs supprimées en PL/SQL |
| Erreur fréquente | ORA-02292 : violation de contrainte d’intégrité référentielle |
| Performance | Préférer EXISTS à IN pour les sous-requêtes volumineuses |
Bonnes pratiques Oracle
- Toujours tester avec un SELECT avant de DELETE : Avant d’exécuter votre instruction
DELETE, remplacez-la temporairement par unSELECT COUNT(*)avec la même clauseWHEREpour vérifier le nombre de lignes concernées et éviter les suppressions involontaires. - Travailler en transactions explicites : En environnement de production, ouvrez une transaction explicite, exécutez votre
DELETE, vérifiez le résultat (notamment viaSQL%ROWCOUNTen PL/SQL), puis validez avecCOMMITou annulez avecROLLBACKselon 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 :
- La commande TRUNCATE en SQL Oracle : découvrez quand et pourquoi utiliser
TRUNCATEà la place deDELETEpour vider une table de façon optimale. - COMMIT et ROLLBACK en SQL Oracle : maîtrisez la gestion des transactions pour sécuriser vos opérations DML, notamment vos suppressions de données.
- Les contraintes d’intégrité en SQL Oracle : comprenez les clés étrangères, les contraintes
ON DELETE CASCADEet leur impact sur vos suppressions de données.
Sur le même thème
- OFFSET en SQL Oracle : Pagination et Exemples Pratiques
- ROWNUM Oracle : Guide complet avec exemples SQL
- COMMIT Oracle SQL : valider vos transactions facilement
- FETCH FIRST Oracle : limiter les résultats SQL facilement
- Clause WITH Oracle SQL : CTE et sous-requêtes nommées
- Les sous-requêtes SQL Oracle : Guide complet et exemples
