
La commande INSERT en SQL Oracle : guide complet avec exemples
La commande INSERT en SQL Oracle est l’instruction fondamentale qui permet d’ajouter de nouvelles lignes dans une table de base de données. Que vous alimentiez une table de référence, intégriez des données issues d’un autre système ou automatisiez des flux ETL, maîtriser le INSERT SQL Oracle est indispensable pour tout développeur ou administrateur de base de données Oracle.
Définition et utilisation du INSERT en SQL Oracle
La commande INSERT appartient au sous-langage DML (Data Manipulation Language) du SQL. Elle permet d’insérer une ou plusieurs lignes dans une table ou une vue Oracle. Une instruction INSERT non validée reste dans une transaction ouverte : elle n’est définitivement enregistrée qu’après l’exécution d’un COMMIT, ou annulée via un ROLLBACK.
Cas d’usage en entreprise
- Alimentation de tables de référence : ajout de nouveaux produits, clients ou fournisseurs.
- Chargement de données ETL : insertion de données transformées depuis une zone de staging.
- Gestion de logs applicatifs : enregistrement d’événements ou d’actions utilisateurs.
- Initialisation de tables temporaires : préparation de données pour des calculs complexes.
Oracle prend en charge deux variantes principales du INSERT : l’insertion de valeurs explicites (INSERT INTO ... VALUES) et l’insertion depuis une requête (INSERT INTO ... SELECT). Oracle propose également le INSERT ALL pour des insertions multi-tables en une seule instruction.
Syntaxe complète du INSERT SQL Oracle
Forme 1 — Insertion de valeurs explicites
INSERT INTO nom_table (colonne1, colonne2, colonne3, ...)
VALUES (valeur1, valeur2, valeur3, ...);
Forme 2 — Insertion depuis une sous-requête
INSERT INTO nom_table (colonne1, colonne2, colonne3, ...)
SELECT expression1, expression2, expression3, ...
FROM source_table
WHERE condition;
Forme 3 — INSERT ALL (multi-tables)
INSERT ALL
INTO table1 (colonne1, colonne2) VALUES (val1, val2)
INTO table2 (colonne1, colonne2) VALUES (val3, val4)
SELECT 1 FROM DUAL;
Explication des paramètres essentiels
| Paramètre | Description | Obligatoire |
|---|---|---|
nom_table | Nom de la table ou de la vue cible dans laquelle insérer les données | Oui |
(colonne1, ...) | Liste des colonnes cibles. Si omise, toutes les colonnes de la table sont attendues dans l’ordre de création | Recommandé |
VALUES | Mot-clé suivi des valeurs littérales à insérer. Doit correspondre exactement à la liste de colonnes | Oui (forme 1) |
SELECT | Sous-requête fournissant les données à insérer. Les types de colonnes doivent être compatibles | Oui (forme 2) |
DUAL | Table système Oracle à une seule ligne, utilisée dans INSERT ALL pour satisfaire la clause SELECT obligatoire | Contexte INSERT ALL |
Note Oracle : Si une colonne possède une valeur
DEFAULTdéfinie au niveau de la table, vous pouvez utiliser le mot-cléDEFAULTà la place d’une valeur explicite dans la clauseVALUES.
Exemples pratiques de INSERT en SQL Oracle
Exemple 1 — Insertion d’un nouveau client (valeurs explicites)
Contexte métier : Une entreprise de e-commerce souhaite ajouter un nouveau client dans sa table CLIENTS après son inscription sur le site.
-- Création de la table pour l'exemple
CREATE TABLE clients (
client_id NUMBER PRIMARY KEY,
nom VARCHAR2(100) NOT NULL,
email VARCHAR2(150) NOT NULL,
date_creation DATE DEFAULT SYSDATE,
statut VARCHAR2(20) DEFAULT 'ACTIF'
);
-- Insertion d'un nouveau client
INSERT INTO clients (client_id, nom, email, date_creation, statut)
VALUES (
1001, -- Identifiant unique du client
'Martin Dupont', -- Nom complet
'martin.dupont@email.fr', -- Adresse email
SYSDATE, -- Date du jour Oracle
'ACTIF' -- Statut par défaut
);
-- Validation de la transaction
COMMIT;
Dans cet exemple, SYSDATE est une fonction Oracle native qui retourne la date et l’heure courantes du serveur. Après le COMMIT, la ligne est définitivement persistée en base.
Exemple 2 — Insertion depuis une sous-requête (INSERT INTO … SELECT)
Contexte métier : En fin de mois, le service comptable archive les commandes clôturées depuis la table COMMANDES vers une table d’archive COMMANDES_ARCHIVE.
-- Table d'archive (même structure que COMMANDES)
CREATE TABLE commandes_archive AS
SELECT * FROM commandes WHERE 1 = 0; -- Crée la structure sans données
-- Insertion des commandes clôturées du mois précédent
INSERT INTO commandes_archive (
commande_id,
client_id,
montant_total,
date_commande,
statut
)
SELECT
c.commande_id,
c.client_id,
c.montant_total,
c.date_commande,
c.statut
FROM commandes c
WHERE c.statut = 'CLOTUREE' -- Uniquement les commandes clôturées
AND c.date_commande >= TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM') -- Début du mois précédent
AND c.date_commande < TRUNC(SYSDATE, 'MM'); -- Début du mois courant
-- Nombre de lignes insérées
-- SQL%ROWCOUNT disponible en PL/SQL pour contrôle
COMMIT;
Ici, les fonctions TRUNC et ADD_MONTHS sont spécifiques à Oracle. Cette approche est beaucoup plus performante qu’une boucle ligne par ligne car Oracle traite l’ensemble en une seule opération ensembliste.
Erreurs courantes avec INSERT en SQL Oracle
ORA-00947 : not enough values / ORA-01400 : cannot insert NULL
L’une des erreurs les plus fréquentes survient lorsque le nombre de valeurs dans la clause VALUES ne correspond pas au nombre de colonnes déclarées, ou lorsqu’une colonne définie NOT NULL reçoit une valeur NULL implicite.
-- ❌ Erreur : 3 colonnes déclarées, 2 valeurs fournies
INSERT INTO clients (client_id, nom, email)
VALUES (1002, 'Sophie Bernard'); -- ORA-00947
-- ✅ Correction : fournir une valeur pour chaque colonne listée
INSERT INTO clients (client_id, nom, email)
VALUES (1002, 'Sophie Bernard', 'sophie.bernard@email.fr');
Solution : Vérifiez systématiquement que le nombre et l’ordre des valeurs dans VALUES correspondent exactement à la liste de colonnes. En cas de valeur inconnue pour une colonne nullable, utilisez explicitement le mot-clé NULL.
Résumé
| Point clé | Détail |
|---|---|
| Commande | INSERT INTO ... VALUES ou INSERT INTO ... SELECT |
| Type LMD | DML — nécessite un COMMIT pour être permanent |
| Multi-table Oracle | INSERT ALL avec SELECT FROM DUAL |
| Valeur courante | SYSDATE pour la date/heure Oracle |
| Valeur par défaut | Mot-clé DEFAULT utilisable dans VALUES |
| Erreur fréquente | ORA-00947 / ORA-01400 : incohérence colonnes / valeurs |
| Performance | Privilégier INSERT … SELECT aux boucles ligne par ligne |
2 bonnes pratiques Oracle essentielles
- Toujours lister explicitement les colonnes cibles. Ne jamais utiliser
INSERT INTO table VALUES (...)sans nommer les colonnes. Si la structure de la table évolue (ajout, suppression ou réordonnancement de colonnes), votre instruction restera valide et maintenable. - Utiliser les séquences Oracle ou GENERATED AS IDENTITY pour les clés primaires. Plutôt que de gérer manuellement les identifiants, utilisez une séquence (
ma_sequence.NEXTVAL) ou la syntaxeGENERATED ALWAYS AS IDENTITYdisponible depuis Oracle 12c pour garantir l’unicité des clés sans risque de conflit.
Aller plus loin
La maîtrise du INSERT en SQL Oracle ouvre la voie à des opérations DML plus avancées. Voici trois sujets complémentaires pour approfondir vos connaissances :
- La commande UPDATE en SQL Oracle : Apprenez à modifier des données existantes dans une table avec des critères précis et des sous-requêtes corrélées.
- La commande MERGE en SQL Oracle : Découvrez comment combiner INSERT et UPDATE en une seule instruction pour des synchronisations de tables efficaces (opération UPSERT).
- Les séquences Oracle (SEQUENCE) : Maîtrisez la génération automatique de clés primaires avec les objets séquence Oracle pour sécuriser vos insertions en environnement multi-utilisateurs.
Sur le même thème
- MERGE Oracle SQL : Syntaxe, Exemples et Bonnes Pratiques
- ORDER BY en SQL Oracle : tri des résultats expliqué
- ROLLBACK Oracle : annuler une transaction SQL facilement
- DELETE en SQL Oracle : Syntaxe et Exemples Pratiques
- OFFSET en SQL Oracle : Pagination et Exemples Pratiques
- ROWNUM Oracle : Guide complet avec exemples SQL
