
SEQUENCE Oracle SQL : Générer des Identifiants Uniques Automatiquement
La SEQUENCE Oracle SQL est un objet de base de données permettant de générer automatiquement des valeurs numériques uniques et séquentielles. Indispensable dans les environnements d’entreprise, elle est utilisée pour alimenter des clés primaires, des numéros de commande ou des identifiants techniques. Maîtriser la SEQUENCE Oracle vous permet de garantir l’unicité des données sans gérer manuellement les compteurs.
Définition et utilisation d’une SEQUENCE Oracle SQL
Une SEQUENCE est un objet indépendant du schéma de table qui produit une suite de nombres entiers selon des règles définies à sa création. Elle est totalement autonome : elle ne dépend d’aucune table et peut être partagée entre plusieurs tables ou processus.
Cas d’usage en entreprise
- Clé primaire automatique : générer un identifiant unique lors de chaque insertion dans une table (clients, commandes, factures).
- Numérotation de documents : créer des numéros de bons de livraison ou de tickets de support horodatés.
- Environnements multi-utilisateurs : garantir l’unicité des valeurs même lors d’accès concurrents à la base de données, sans risque de doublon.
- Systèmes de log : attribuer un identifiant croissant à chaque événement enregistré dans une table d’audit.
Contrairement à une colonne IDENTITY (disponible depuis Oracle 12c), la SEQUENCE offre une flexibilité maximale : un seul objet peut alimenter plusieurs tables simultanément.
Syntaxe complète de la SEQUENCE Oracle
CREATE SEQUENCE nom_sequence
[START WITH valeur_initiale]
[INCREMENT BY pas_increment]
[MINVALUE valeur_min | NOMINVALUE]
[MAXVALUE valeur_max | NOMAXVALUE]
[CYCLE | NOCYCLE]
[CACHE taille_cache | NOCACHE]
[ORDER | NOORDER];
Explication des paramètres essentiels
| Paramètre | Description | Valeur par défaut |
|---|---|---|
START WITH | Valeur de départ de la séquence | 1 |
INCREMENT BY | Pas d’incrément (positif ou négatif) | 1 |
MINVALUE | Valeur minimale autorisée | 1 |
MAXVALUE | Valeur maximale autorisée | 10^27 |
CYCLE | Recommence depuis MINVALUE après MAXVALUE | NOCYCLE |
CACHE | Nombre de valeurs pré-allouées en mémoire | 20 |
ORDER | Garantit l’ordre des valeurs en environnement RAC | NOORDER |
Les pseudo-colonnes NEXTVAL et CURRVAL
Pour utiliser une séquence, Oracle expose deux pseudo-colonnes :
nom_sequence.NEXTVAL: retourne la prochaine valeur disponible et incrémente le compteur.nom_sequence.CURRVAL: retourne la valeur courante dans la session (nécessite qu’un NEXTVAL ait été appelé au préalable).
Exemples pratiques de SEQUENCE Oracle SQL
Exemple 1 – Gestion des clients dans un système CRM
Contexte : Une entreprise souhaite attribuer automatiquement un identifiant unique à chaque nouveau client enregistré dans sa base CRM.
-- Étape 1 : Création de la table CLIENTS
CREATE TABLE CLIENTS (
CLIENT_ID NUMBER(10) PRIMARY KEY,
NOM VARCHAR2(100) NOT NULL,
EMAIL VARCHAR2(150),
DATE_CREATION DATE DEFAULT SYSDATE
);
-- Étape 2 : Création de la séquence pour les identifiants clients
CREATE SEQUENCE SEQ_CLIENTS
START WITH 1000 -- Les IDs commencent à 1000
INCREMENT BY 1 -- Incrément de 1 à chaque appel
MINVALUE 1000 -- Valeur minimale
NOMAXVALUE -- Pas de limite maximale
NOCYCLE -- Pas de remise à zéro
CACHE 50; -- 50 valeurs pré-allouées en mémoire
-- Étape 3 : Insertion d'un nouveau client en utilisant la séquence
INSERT INTO CLIENTS (CLIENT_ID, NOM, EMAIL)
VALUES (SEQ_CLIENTS.NEXTVAL, 'Martin Dupont', 'martin.dupont@email.fr');
-- Étape 4 : Vérification de la valeur courante dans la session
SELECT SEQ_CLIENTS.CURRVAL AS ID_GENERE FROM DUAL;
Résultat : le premier client aura l’identifiant 1000, le deuxième 1001, et ainsi de suite.
Exemple 2 – Numérotation automatique des commandes avec un TRIGGER
Contexte : Dans un système e-commerce, chaque commande doit recevoir automatiquement un numéro unique sans que l’application ait à le gérer.
-- Création de la table COMMANDES
CREATE TABLE COMMANDES (
COMMANDE_ID NUMBER(10) PRIMARY KEY,
CLIENT_ID NUMBER(10) NOT NULL,
MONTANT NUMBER(12, 2),
DATE_COMMANDE DATE DEFAULT SYSDATE
);
-- Création de la séquence pour les commandes
CREATE SEQUENCE SEQ_COMMANDES
START WITH 100000 -- Numérotation à partir de 100000
INCREMENT BY 1
NOCYCLE
CACHE 100; -- Cache élevé pour de meilleures performances
-- Création d'un TRIGGER BEFORE INSERT pour alimenter automatiquement la clé
CREATE OR REPLACE TRIGGER TRG_COMMANDES_BI
BEFORE INSERT ON COMMANDES
FOR EACH ROW
BEGIN
-- Si l'ID n'est pas fourni, on utilise la séquence
IF :NEW.COMMANDE_ID IS NULL THEN
:NEW.COMMANDE_ID := SEQ_COMMANDES.NEXTVAL;
END IF;
END;
/
-- Insertion sans préciser l'ID : le TRIGGER s'en charge
INSERT INTO COMMANDES (CLIENT_ID, MONTANT)
VALUES (1000, 249.99);
-- Vérification du résultat
SELECT * FROM COMMANDES;
Résultat : la commande est insérée avec l’identifiant 100000, automatiquement attribué par le trigger et la séquence.
Erreurs courantes avec la SEQUENCE Oracle SQL
Erreur : ORA-08002 – CURRVAL non défini dans la session
Message d’erreur :
ORA-08002: sequence SEQ_CLIENTS.CURRVAL is not yet defined in this sessionCause : Vous tentez d’utiliser CURRVAL sans avoir appelé NEXTVAL au préalable dans la même session Oracle. CURRVAL ne peut retourner une valeur que si la séquence a déjà été incrémentée une fois dans la session en cours.
Solution : Appelez toujours NEXTVAL avant CURRVAL dans votre session :
-- Appel obligatoire de NEXTVAL en premier
SELECT SEQ_CLIENTS.NEXTVAL FROM DUAL;
-- CURRVAL est maintenant accessible dans cette session
SELECT SEQ_CLIENTS.CURRVAL FROM DUAL;
Résumé de la SEQUENCE Oracle SQL
| Point clé | Détail |
|---|---|
| Objet Oracle | Générateur de valeurs numériques uniques et séquentielles |
| Création | CREATE SEQUENCE nom_sequence |
| Utilisation | nom_sequence.NEXTVAL et nom_sequence.CURRVAL |
| CACHE | Améliore les performances en pré-allouant des valeurs |
| CYCLE | Permet la remise à zéro après MAXVALUE (à utiliser avec précaution) |
| Indépendance | Un seul objet peut alimenter plusieurs tables |
| Modification | ALTER SEQUENCE (impossible de modifier START WITH) |
| Suppression | DROP SEQUENCE nom_sequence |
2 bonnes pratiques Oracle
- Utilisez toujours CACHE : activez le cache (valeur recommandée entre 20 et 100) pour éviter les accès disque à chaque appel de NEXTVAL. En environnement à forte volumétrie, un NOCACHE peut sérieusement dégrader les performances.
- Ne comptez pas sur la continuité des valeurs : en cas de rollback d’une transaction ou de redémarrage du serveur, des « trous » peuvent apparaître dans la séquence. Ce comportement est normal sous Oracle. Si des numéros strictement continus sont requis, préférez une logique applicative dédiée.
Aller plus loin sur les objets Oracle SQL
Maintenant que vous maîtrisez la SEQUENCE Oracle SQL, approfondissez vos connaissances avec ces sujets complémentaires :
- TRIGGER Oracle SQL : automatisez les actions sur vos tables grâce aux déclencheurs
- SYNONYM Oracle SQL : simplifiez l’accès aux objets de votre base de données
- INDEX Oracle SQL : optimisez les performances de vos requêtes SELECT
