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

SQL Oracle Discussion :

Valeur courante d'une séquence


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut Valeur courante d'une séquence
    Bonjour,

    je voudrais réaliser un script PL qui récupère la valeur courante d'une séquence.
    Or lors de l'exécution de la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT maSeq.CURRVAL FROM DUAL;
    J'ai l'erreur ORA 08002 qui dit que :

    Cause: sequence CURRVAL has been selected before sequence NEXTVAL

    Action: select NEXTVAL from the sequence before selecting CURRVAL


    Bref du coup je me demande s'il existe un moyen de récupérer la valeur d'une séquence sans être précédemment obligé de l'incrémenter ?

    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT last_number FROM user_sequences
    WHERE sequence_name = 'NOM_SEQUENCE'
    (le nom de la séquence est stocké en majuscules dans la table)
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    merci

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Attention au cache.

    Le Last_number donne le prochain chargement du cache.

    Exemple avec un cache de 20, sur une séquence non chargée en mémoire :
    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
    SELECT last_number
    FROM user_sequences
    WHERE sequence_name = 'S_BESREV'
     
    382
     
    SELECT  S_BESREV.NEXTVAL
    FROM dual
     
    382
     
    SELECT last_number
    FROM user_sequences
    WHERE sequence_name = 'S_BESREV'
     
    402
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Bien vu McM. Dans ce cas, voici une version qui tient compte du cache:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT last_number - cache_size FROM user_sequences
    WHERE sequence_name = 'MA_SEQUENCE'
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, toujours pas

    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
    SELECT last_number, last_number - cache_size 
    FROM user_sequences
    WHERE sequence_name = 'S_BESREV'
     
    LAST_NUMBER	LAST_NUMBER-CACHE_SIZE
    402	382
     
    SELECT  S_BESREV.NEXTVAL
    FROM dual
    383
     
    SELECT last_number, last_number - cache_size 
    FROM user_sequences
    WHERE sequence_name = 'S_BESREV'
    LAST_NUMBER	LAST_NUMBER-CACHE_SIZE
    402	382
    Les n° de séquence sont stockés en base.

    Quand on fait appel au n° suivant (nextval), la première fois, Oracle monte en mémoire les "cache" n° suivants, et met à jour le prochain n° de la séquence en base (last_number)

    Tant qu'on n'a pas atteint la fin des n° en mémoire ou que ces n° en mémoire ne sont pas effacés (flush, ou écrasement), les nextval suivant lisent le n° en mémoire.
    En base, rien ne change.

    Il n'y a aucun moyen de savoir quel est le prochain n° qui sera attribué sans le réserver par un nextval si le cache > 1.

    Mettre un cache = 1 pour une séquence qui bouge beaucoup n'est pas trop recommandé vu qu'Oracle est donc obligé de poser un verrou sur la séquence (pour la mettre à jour) puis de la monter en mémoire, et ce à chaque appel.

    Un petit exemple de ce qu'il y a en base (last_number de user_sequences) et en mémoire avec un cache de 5
    base = 1, Mémoire vide
    NEXTVAL
    Base = 6, Memoire 1-5:N° attrib=1
    NEXTVAL
    Base = 6, Memoire 1-5:N° attrib=2
    NEXTVAL
    Base = 6, Memoire 1-5:N° attrib=3
    FLUSH
    Base = 6, Memoire Vide
    NEXTVAL
    Base = 11, Memoire 6-10:N° attrib=6
    NEXTVAL
    Base = 11, Memoire 6-10:N° attrib=7
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    on peut remédier ce problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER SEQUENCE seq_cache NOCACHE;
    problème de l'erreur08002
    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
     
    begin 
    declare v number ;
    curr_not_found exception ;
    pragma exception_init(curr_not_found ,-08002);
    begin 
    select nom_seq.currval 
    into v
    from dual;
    exception 
    when curr_not_found then 
    select nom_seq.nextval 
    into v
    from dual;
    when others then 
    .......
    end ;

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

Discussions similaires

  1. Java + Ibatis + Oracle -> récupérer la valeur courante de la séquence
    Par nico1214 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 01/12/2011, 16h13
  2. Valeur courante d'une séquence
    Par lido dans le forum Forms
    Réponses: 2
    Dernier message: 07/07/2008, 10h00
  3. Réponses: 4
    Dernier message: 14/05/2007, 13h44
  4. Oracle : Modifier la valeur courante d'une séquence
    Par arkienou dans le forum Oracle
    Réponses: 7
    Dernier message: 10/08/2006, 09h08
  5. Selectionner la valeur courante d'une liste
    Par genova dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/01/2006, 20h46

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