SAP Tutoriel HANA : Créer une séquence

⚡ Résumé intelligent

Créer une séquence dans SAP HANA définit un objet de base de données qui génère automatiquement une liste incrémentée de valeurs numériques. Les paramètres contrôlent la valeur initiale, l'incrément, les limites, la boucle et le comportement de mise en cache du générateur.

  • (I.e. Définition principale : Une séquence génère des nombres selon les règles définies dans sa spécification, de manière croissante ou décroissante.
  • 🔗 Pas de reliure de table : Les séquences sont des objets indépendants utilisés par l'application et non rattachés à une table.
  • 📍 Deux valeurs : CURRVAL renvoie la valeur actuelle et NEXTVAL fait avancer la séquence et renvoie la nouvelle.
  • 🇧🇷 Paramètres clés: START WITH, INCREMENT BY, MAXVALUE, MINVALUE, CYCLE et CACHE façonnent la sortie.
  • ♻️ Cyclisme: CYCLE redémarre la numérotation à la limite ; NO CYCLE est la valeur par défaut et génère une erreur.
  • | Mise en cache: CACHE réserve un bloc de numéros par nœud pour optimiser la vitesse ; NO CACHE est la valeur par défaut.
  • (I.e. Option de réinitialisation : RESET BY exécute une sous-requête lors du redémarrage de la base de données et reprend à partir de la valeur qu'elle renvoie.

Créer une séquence dans SAP HANA

Qu'est-ce que la séquence ?

Une séquence est un objet de base de données qui génère automatiquement la liste incrémentée de valeurs numériques conformément à la règle spécifiée dans la spécification de séquence.

Par exemple, pour insérer automatiquement le numéro d'employé dans la colonne (EMPLOYEE_NO) du tableau, lorsqu'un nouvel enregistrement est inséré dans le tableau, nous utilisons alors la séquence.

Les valeurs de séquence sont générées par ordre croissant ou décroissant.

Les séquences ne sont pas associées aux tables ; ils sont utilisés par l'application. Il y a deux valeurs en séquence –

  • CURRVAL – Fournit la valeur actuelle de la séquence.
  • NEXTVAL – Fournit la valeur suivante de la séquence.

SYNTAXE

CREATE SEQUENCE <sequence_name> [<sequence_parameter_list>] [RESET BY <subquery>]

ÉLÉMENTS DE SYNTAXE

ÉLÉMENTS DESCRIPTION
C'est le nom de la séquence.
[ ] Il spécifie un ou plusieurs paramètres de séquence.
COMMENCER AVEC Il décrit la valeur de la séquence de départ.
AUGMENTATION DE Ceci spécifie la valeur à incrémenter à partir de la dernière valeur attribuée à chaque fois qu'une nouvelle valeur de séquence est générée. La valeur par défaut est 1.
VALEUR MAX Ceci spécifie la valeur maximale pouvant être générée par la séquence. peut être compris entre -4611686018427387903 et 4611686018427387902.
PAS DE VALEURMAX Lorsque l'option NO MAXVALUE est spécifiée, pour une séquence ascendante, la valeur maximale sera de 4611686018427387903 et la valeur minimale pour une séquence descendante sera de -1.
VALEUR MIN / PAS DE MINVALEUR Elle spécifie la valeur minimale qu'une séquence peut générer. peut être compris entre -4611686018427387904 et 4611686018427387902. Lorsque l'option NO MINVALUE est utilisée, la valeur minimale pour une séquence ascendante est 1.
CYCLE La directive CYCLE spécifie que le numéro de séquence sera redémarré après avoir atteint sa valeur maximale ou minimale.
PAS DE CYCLE Option par défaut. La directive NO CYCLE indique que le numéro de séquence ne sera pas redémarré après avoir atteint sa valeur maximale ou minimale.
CACHE La taille du cache spécifie la plage de numéros de séquence qui sera mise en cache dans un nœud. doit être un entier non signé.
PAS DE CACHE Option par défaut. La directive NO CACHE indique que le numéro de séquence ne sera pas mis en cache dans un nœud.
RÉINITIALISATION PAR Il précise que lors du redémarrage de la base de données, la base de données exécute automatiquement le et la valeur de séquence est redémarrée avec la valeur renvoyée.

Exemple -

Nous allons créer une séquence nommée DHK_SCHEMA.EMP_NO, qui créera une valeur incrémentée de la séquence de +1 à chaque fois, lorsque la séquence est utilisée.

Script de séquence –

CREATE SEQUENCE DHK_SCHEMA.EMP_NO START WITH 100 INCREMENT BY 1;

Ici, nous utiliserons l'objet « séquence » dans l'exemple ci-dessous pour incrémenter la valeur du numéro d'employé de +1 à chaque fois que la requête de sélection est exécutée. Dans la requête, le « nextval » peut être utilisé pour la génération de numéros de série ou le même type d'exigence.

Utilisation de la séquence –

SELECT DHK_SCHEMA.EMP_NO.nextval FROM DUMMY;

RÉSULTAT – 100, 101, 102 … et ainsi de suite pour chaque exécution de la requête SELECT ci-dessus.

Comment utiliser une séquence dans un tableau

L'exemple ci-dessus renvoie un nombre sans le stocker. Trois modèles permettent de relier une séquence à des données réelles ; le choix le plus approprié dépend du niveau de contrôle requis par l'application.

1) Appelez NEXTVAL directement dans l'INSERT. L'approche la plus explicite. L'application décide quand un nombre est consommé.

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE (
  EMPLOYEE_NO INTEGER NOT NULL,
  EMP_NAME    NVARCHAR(100),
  PRIMARY KEY (EMPLOYEE_NO)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE
  VALUES (DHK_SCHEMA.EMP_NO.NEXTVAL, 'Anita Sharma');

2) Utilisez la séquence comme valeur par défaut de colonne. Le numéro est attribué même lorsque l'instruction d'insertion ne mentionne pas la colonne, ce qui convient aux applications qui n'ont jamais été conçues pour connaître la séquence.

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE2 (
  EMPLOYEE_NO INTEGER DEFAULT DHK_SCHEMA.EMP_NO.NEXTVAL,
  EMP_NAME    NVARCHAR(100)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE2 (EMP_NAME) VALUES ('Ravi Kumar');

3) Lisez la valeur qui vient d'être émise. CURRVAL renvoie le dernier numéro utilisé lors de cette session, ce qui permet de lier une ligne enfant à la ligne parente qui vient d'être insérée.

SELECT DHK_SCHEMA.EMP_NO.CURRVAL FROM DUMMY;

⚠️ Attention : CURRVAL renvoie une erreur tant que NEXTVAL n'a pas été appelé au moins une fois dans la session en cours. Il renvoie la valeur émise pour cette session, et non la valeur maximale globale ; deux sessions peuvent donc avoir des valeurs actuelles différentes simultanément.

Colonne de séquence vs identité

SAP HANA propose également une colonne d'identité, qui génère des nombres sans objet distinct. Les deux solutions répondent au même problème, mais différemment.

Paramètres Séquence Colonne d'identité
Type d'objet Objet de base de données indépendant Propriété de colonne d'une table
Partagé entre les tables Oui, un nombre quelconque de tables peut y puiser. Non, cela appartient à une seule colonne
Valeur visible avant insertion Oui, via NEXTVAL Non, généré lors de l'insertion
Définition CRÉER UNE SÉQUENCE GÉNÉRÉ PAR DÉFAUT COMME IDENTITÉ
Meilleur pour Numérotation partagée, insertions parent et enfant Une simple clé de substitution sur une table

Choisissez une séquence lorsque le numéro doit être connu avant l'existence de la ligne, ou lorsque plusieurs tables partagent une même série de numérotation. Choisissez une colonne d'identité pour une clé de substitution simple, sans autre exigence.

Gestion des séquences : MODIFIER, SUPPRIMER et les lacunes

Une séquence reste rarement inchangée depuis sa création. Trois tâches de maintenance reviennent régulièrement.

Modifier le comportement. ALTER SEQUENCE ajuste l'incrément, les limites ou le cycle d'une séquence existante sans perteping La commande RESTART WITH réinitialise le compteur, ce qui est l'étape habituelle après un rechargement des données de test.

ALTER SEQUENCE DHK_SCHEMA.EMP_NO RESTART WITH 1000;
ALTER SEQUENCE DHK_SCHEMA.EMP_NO INCREMENT BY 10;
DROP SEQUENCE DHK_SCHEMA.EMP_NO;

Comprendre les lacunes. La contiguïté des numéros de séquence n'est pas garantie, ce qui surprend ceux qui s'attendent à une piste d'audit ininterrompue. Des lacunes apparaissent pour trois raisons :

  • Transactions annulées. NEXTVAL n'est pas transactionnel. Un numéro utilisé lors d'une insertion qui est ensuite annulée n'est jamais réattribué.
  • Mise en cache. Avec CACHE 100, un nœud réserve cent valeurs simultanément. Un redémarrage supprime les valeurs inutilisées de ce bloc.
  • Sessions simultanées. Deux sessions insérant simultanément entrelacent leurs numéros, de sorte qu'aucune ne voit une séquence continue.

En pratique, une séquence doit être considérée comme une source d'identifiants uniques, et non comme un compteur du nombre de lignes. Lorsqu'une série ininterrompue est une obligation légale, comme pour la numérotation des factures, elle doit être générée par la logique applicative avec ses propres contrôles, et non par une séquence de base de données.

Trouver ce qui existe. La vue système SEQUENCES liste chaque séquence avec sa valeur actuelle, ce qui constitue le moyen le plus rapide d'auditer un schéma. La syntaxe associée est traitée dans SAP HANASQL et les définitions de colonnes dans SAP Types de données HANA.

FAQ

Les transactions annulées, les blocs mis en cache perdus au redémarrage et les sessions simultanées créent tous des lacunes. Une séquence garantit l'unicité des données, et non une suite continue de valeurs.

Oui. Une séquence est indépendante de toute table ; plusieurs tables peuvent donc y puiser des données. Ceci est utile lorsque les identifiants doivent être uniques pour l’ensemble du schéma plutôt que pour chaque table.

Oui. L'analyse du débit d'insertion montre combien de valeurs un nœud consomme entre deux redémarrages, ce qui permet d'équilibrer le gain de vitesse apporté par la mise en cache et la taille des intervalles qu'elle crée.

Oui. La comparaison des valeurs actuelles avec MAXVALUE et le taux de consommation permet de prédire l'épuisement, de sorte qu'une séquence est élargie avant que les insertions ne commencent à échouer en production.

Comme NEXTVAL n'a pas été appelé dans la session actuelle, CURRVAL renvoie la valeur émise pour cette session et n'a donc rien à renvoyer tant qu'aucune valeur n'a été extraite.

Résumez cet article avec :