IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Ma sequence saute certains nonbres.


Sujet :

Oracle

  1. #1
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut Ma sequence saute certains nonbres.
    Salut,
    J'ai crée une sequence seq_connexion pour génèrer les clés primaires automatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create sequence seq_connexion start with 1 increment by 1;
    hier ça fonctionnait, les clés étaitent: 1, 2, 3. Ce matin elle continue à 21, 22, 23. donc elle à sauté les nombres 4, 5 ... 20.
    pourquoi?
    Et c'est comme ça a chaque fois que je redémarre la machine. aprés elle passe à 41, 42, 43. elle saute les nombres 24, 25 ... 40.
    Est ce normal que quand je redemarre la machine, elle continue avec n'importe quel nombre?

    Merci.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tout à fait normal, une séquence peut comporter des "trous"
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    regarde les paramètres de ta séquence... tu dois avoir un certain nombre au paramètre "Cache".

    si la base est redémarrée, le nombre de no séquentiels mis en cache est perdu...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est parce que tu as défini un cache de 10 probablement... donc Oracle réserve 10 chiffres à l'avance mais si tu redémarres la base ces chiffres réservés sont perdus

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Une autre possibilité est que la transaction qui réalise l'insertion soir annulée.

    Dans ce cas, le trigger qui calcule le nextval est appellé, mais le rollback ne décrémente pas la séquence, d'où les trous.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    C'est tout simple : une séquence a son paramètre CACHE fixé à 20 par défaut. Comme vous n'avez pas précisé une autre valeur, ni choisi NOCACHE, cette valeur de 20 s'applique.
    Vous pouvez d'ailleurs le vérifier dans la colonne CACHE_SIZE de USER_SEQUENCES.

    Et comme le cache est vidé à l'arrêt de la base, vous progressez de 20 en 20 à chaque fois que vous redémarrez la base.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  7. #7
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Pour enlever ces trous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CREATE OR REPLACE PROCEDURE pr_classement(nom_tb IN VARCHAR2,pk_tb IN VARCHAR2) AS
    	ldd VARCHAR2(500);
    	TYPE refcursor IS REF CURSOR;
    	curseur refcursor;
    	curseur2 refcursor;
    	pk_old NUMBER(6);
    	pk_max NUMBER(6);
    	test_table VARCHAR2(30);
    	compteur NUMBER(6):=0;
    BEGIN
    	OPEN curseur2 FOR 'SELECT table_name FROM CAT';
    	LOOP
    		FETCH curseur2 INTO test_table;
    		EXIT WHEN curseur2%NOTFOUND;
    		IF test_table='TB_COPIE' THEN
    			EXECUTE IMMEDIATE 'DROP TABLE tb_copie';
    		END IF;
    	END LOOP;
    	ldd:='CREATE TABLE tb_copie AS SELECT * FROM '||nom_tb||' ORDER BY '||pk_tb;
    	EXECUTE IMMEDIATE ldd;
    	OPEN curseur FOR 'SELECT '||pk_tb||' FROM tb_copie';
    	LOOP
    		FETCH curseur INTO pk_old;
    		EXIT WHEN curseur%NOTFOUND;
    		compteur:=compteur+1;
    		dbms_output.put_line('Ancienne clé:'||pk_old||' remplacée par '||compteur);
    		ldd:='UPDATE '||nom_tb||' SET '||pk_tb||'='||compteur||' WHERE '||pk_tb||'='||pk_old;
    		EXECUTE IMMEDIATE ldd;
    	END LOOP;
    	CLOSE curseur;
    	EXECUTE IMMEDIATE 'DROP TABLE tb_copie';
    END;
    /
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est pas un peu lent sur des grosses tables ce script ?

  9. #9
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Si, il me faut encore l'optimiser, mais c'est pratique pour les petites tables (moins de 400 enregistrements). Je susi en train de l'optimiser, il me fallait pour moi une solution rapide pour mes petites tables...

    [EDIT] Quand je dis rapide, c'est qu'il me la fallait pour hier, qu'il faut comprendre [/EDIT]
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    l'idéal serait que le script trouve la PK tout seul 8)

  11. #11
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut

    Pfffffou... Je ne suis pas encore sorti de l'auberge
    Effectivement, ce serais une idée... Merci pour cette info, je viens de trouver quelque chsoe, là...
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  12. #12
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Merci à tous.

    Pomalaix à dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    C'est tout simple : une séquence a son paramètre CACHE fixé à 20 par défaut. Comme vous n'avez pas précisé une autre valeur, ni choisi NOCACHE, cette valeur de 20 s'applique. 
    Vous pouvez d'ailleurs le vérifier dans la colonne CACHE_SIZE de USER_SEQUENCES. 
     
    Et comme le cache est vidé à l'arrêt de la base, vous progressez de 20 en 20 à chaque fois que vous redémarrez la base.
    Avec ça je n'ai plus de trous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     create sequence seq_connexion start with 1 increment by 1 nocache;
    Merci encore.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  13. #13
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 81
    Points : 69
    Points
    69
    Par défaut
    essey de mettre des citations au lieu des codes;

    donc ça marche si vous éliminé le cache, géniale
    Oracle c'est pas des Miracles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/03/2012, 09h42
  2. Réponses: 6
    Dernier message: 29/01/2012, 22h45
  3. [Sequence] Encore et toujours des sauts
    Par elkamaro dans le forum Oracle
    Réponses: 15
    Dernier message: 16/10/2009, 15h24
  4. [sed]Suppression de saut de ligne dans certains cas
    Par Anthony.Desvernois dans le forum Linux
    Réponses: 11
    Dernier message: 09/07/2007, 11h33
  5. encodage de certains caractères (saut ligne)
    Par benkunz dans le forum Langage
    Réponses: 11
    Dernier message: 18/10/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo