Comment récupérer la valeur actuelle d’une séquence d’Oracle sans l’incrémenter?

Existe-t-il une instruction SQL pour récupérer la valeur d’une séquence qui ne l’incrémente pas.

Merci.

EDIT ET CONCLUSION

Comme indiqué par Justin Cave Il n’est pas utile d’essayer de “sauver” le numéro de séquence pour

select a_seq.nextval from dual; 

est suffisant pour vérifier une valeur de séquence.

Je garde toujours la réponse de Ollie comme étant la bonne car elle répond à la question initiale. mais demandez-vous s’il est nécessaire de ne pas modifier la séquence si vous le souhaitez.

 SELECT last_number FROM all_sequences WHERE sequence_owner = '' AND sequence_name = ''; 

Vous pouvez obtenir une variété de métadonnées de séquence à partir de user_sequences , all_sequences et dba_sequences .

Ces vues fonctionnent entre les sessions.

MODIFIER:

Si la séquence est dans votre schéma par défaut, alors:

 SELECT last_number FROM user_sequences WHERE sequence_name = ''; 

Si vous voulez toutes les métadonnées alors:

 SELECT * FROM user_sequences WHERE sequence_name = ''; 

J’espère que cela aide…

EDIT2:

Une manière très efficace de le faire de manière plus fiable si la taille de votre cache n’est pas 1 serait:

 SELECT increment_by I FROM user_sequences WHERE sequence_name = 'SEQ'; I ------- 1 SELECT seq.nextval S FROM dual; S ------- 1234 -- Set the sequence to decrement by -- the same as its original increment ALTER SEQUENCE seq INCREMENT BY -1; Sequence altered. SELECT seq.nextval S FROM dual; S ------- 1233 -- Reset the sequence to its original increment ALTER SEQUENCE seq INCREMENT BY 1; Sequence altered. 

Attention, si d’autres utilisent la séquence pendant cette période, ils (ou vous) peuvent obtenir

 ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated 

En outre, vous souhaiterez peut-être définir le cache sur NOCACHE avant la réinitialisation, puis revenir à sa valeur d’origine pour vous assurer que vous n’avez pas mis en cache beaucoup de valeurs.

select MY_SEQ_NAME.currval from DUAL;

N’oubliez pas que cela ne fonctionne que si vous avez select MY_SEQ_NAME.nextval from DUAL; dans les sessions en cours.

Ma réponse initiale était factuellement incorrecte et je suis content que cela ait été supprimé. Le code ci-dessous fonctionnera dans les conditions suivantes a) vous savez que personne d’autre n’a modifié la séquence b) la séquence a été modifiée par votre session. Dans mon cas, j’ai rencontré un problème similaire où j’appelais une procédure qui modifiait une valeur et je suis convaincu que l’hypothèse est vraie.

 SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL; 

Malheureusement, si vous n’avez pas modifié la séquence de votre session, je pense que d’autres ont raison de dire que le NEXTVAL est la seule solution.