INSERT en SQL Oracle : syntaxe, exemples et bonnes pratiques

Maîtrisez la commande INSERT en SQL Oracle : syntaxe complète, exemples pratiques, erreurs courantes et bonnes pratiques pour insérer des données efficacement.

Illustration du tutoriel SQL Oracle : INSERT en SQL Oracle : syntaxe, exemples et bonnes pratiques

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.

Publicité

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ètreDescriptionObligatoire
nom_tableNom de la table ou de la vue cible dans laquelle insérer les donnéesOui
(colonne1, ...)Liste des colonnes cibles. Si omise, toutes les colonnes de la table sont attendues dans l’ordre de créationRecommandé
VALUESMot-clé suivi des valeurs littérales à insérer. Doit correspondre exactement à la liste de colonnesOui (forme 1)
SELECTSous-requête fournissant les données à insérer. Les types de colonnes doivent être compatiblesOui (forme 2)
DUALTable système Oracle à une seule ligne, utilisée dans INSERT ALL pour satisfaire la clause SELECT obligatoireContexte INSERT ALL

Note Oracle : Si une colonne possède une valeur DEFAULT définie au niveau de la table, vous pouvez utiliser le mot-clé DEFAULT à la place d’une valeur explicite dans la clause VALUES.

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.

Publicité

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
CommandeINSERT INTO ... VALUES ou INSERT INTO ... SELECT
Type LMDDML — nécessite un COMMIT pour être permanent
Multi-table OracleINSERT ALL avec SELECT FROM DUAL
Valeur couranteSYSDATE pour la date/heure Oracle
Valeur par défautMot-clé DEFAULT utilisable dans VALUES
Erreur fréquenteORA-00947 / ORA-01400 : incohérence colonnes / valeurs
PerformancePrivilégier INSERT … SELECT aux boucles ligne par ligne

2 bonnes pratiques Oracle essentielles

  1. 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.
  2. 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 syntaxe GENERATED ALWAYS AS IDENTITY disponible 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

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é