180 votes

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

Existe-t-il une instruction SQL pour récupérer la valeur d'une séquence sans l'incrémenter ?

Merci.

ÉDITION ET CONCLUSION

Comme indiqué par Justin Cave Il n'est pas utile d'essayer de "sauvegarder" le numéro de séquence de sorte que

select a_seq.nextval from dual;

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

Je garde toujours la réponse d'Ollie comme la bonne car elle répondait à la question initiale. Mais interrogez-vous sur la nécessité de ne pas modifier la séquence si vous voulez un jour le faire.

7 votes

Pourquoi ? Quel est le problème que vous essayez de résoudre ? Si vous utilisez correctement les séquences, vous ne devriez jamais vous soucier des valeurs de séquence qui ont été attribuées à d'autres sessions ou des valeurs qui pourraient être attribuées à des sessions ultérieures.

4 votes

Il s'agit d'une vérification après la migration des données pour s'assurer que la séquence a été mise à jour correctement en fonction des données migrées.

5 votes

Alors quel est l'inconvénient d'obtenir simplement la nextval de la séquence à tester alors ? Vous ne supposez pas que les séquences seront exemptes de trous, n'est-ce pas ? Donc "gaspiller" une valeur de séquence ne devrait pas être un problème.

190voto

Ollie Points 8526
SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<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 dans toutes les sessions.

EDIT :

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

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

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

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

J'espère que cela vous aidera...

EDIT2 :

Un moyen long et fastidieux de le faire de manière plus fiable si la taille de votre cache n'est pas de 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 personnes utilisent la séquence pendant ce temps, elles (ou vous) peuvent obtenir des informations sur la séquence.

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

Aussi, vous pourriez vouloir mettre le cache à NOCACHE avant la réinitialisation, puis à sa valeur initiale après, pour s'assurer que vous n'avez pas mis en cache beaucoup de valeurs.

0 votes

Je viens d'essayer mais je n'ai pas accès à une table 'all_sequences'. S'agit-il d'un objet spécial que l'on ne peut voir qu'avec des identifiants d'administrateur ?

0 votes

Utilisez user_sequences. Cela fonctionnera si vous possédez la séquence que vous recherchez.

1 votes

ALL_SEQUENCES est une vue. Si vous n'y avez pas accès, essayez de sélectionner l'une des options suivantes USER_SEQUENCES si la séquence est dans votre schéma par défaut. (Vous n'aurez pas besoin de l'option sequence_owner = '<sequence_owner>' clause pour USER_SEQUENCES ).

137voto

RonK Points 4107

select MY_SEQ_NAME.currval from DUAL;

Gardez à l'esprit que cela ne fonctionne que si vous avez exécuté select MY_SEQ_NAME.nextval from DUAL; dans les sessions en cours.

1 votes

Merci beaucoup pour votre réponse. Je dois l'utiliser dans Boomi et je cherchais une solution de haut en bas.

6voto

caot Points 11

La suite est souvent utilisée :

select field_SQ.nextval from dual;
select field_SQ.currval from DUAL;

Cependant, ce qui suit est capable de changer la séquence en fonction de ce que vous attendiez. Le site 1 peut être un nombre entier (négatif ou positif)

alter sequence field_SQ increment by 1 minvalue 0

2voto

Ainsworth Points 14

Ce n'est pas vraiment une réponse, et je l'aurais inscrite en tant que commentaire si la question n'avait pas été verrouillée. Ceci répond à la question :

Pourquoi le voudrais-tu ?

Supposons que vous ayez une table avec la séquence comme clé primaire et que la séquence soit générée par un trigger d'insertion. Si vous souhaitez que la séquence soit disponible pour les mises à jour ultérieures de l'enregistrement, vous devez disposer d'un moyen d'extraire cette valeur.

Afin d'être sûr d'obtenir la bonne personne, il est préférable de regrouper l'INSERT et la requête de RonK dans une transaction.

La requête de RonK :

select MY_SEQ_NAME.currval from DUAL;

Dans le scénario ci-dessus, la mise en garde de RonK ne s'applique pas puisque l'insertion et la mise à jour se font dans la même session.

1voto

Roland Points 323

J'ai également essayé d'utiliser CURRVAL, dans mon cas pour savoir si un processus a inséré de nouvelles lignes dans une table avec cette séquence comme clé primaire. Je pensais que CURRVAL serait la méthode la plus rapide. Mais a) CurrVal ne fonctionne pas, il obtiendra simplement l'ancienne valeur parce que vous êtes dans une autre session Oracle, jusqu'à ce que vous fassiez un NEXTVAL dans votre propre session. Et b) a select max(PK) from TheTable est également très rapide, probablement parce qu'un PK est toujours indexé. Ou bien select count(*) from TheTable . Je suis encore en train d'expérimenter, mais les deux SELECTs semblent rapides.

Un écart dans une séquence ne me dérange pas, mais dans mon cas, j'ai pensé à faire beaucoup de sondages, et je détesterais l'idée d'écarts très importants. Surtout si un simple SELECT serait tout aussi rapide.

Conclusion :

  • CURRVAL est plutôt inutile, car il ne détecte pas le NEXTVAL d'une autre session, il ne renvoie que ce que vous saviez déjà de votre précédent NEXTVAL.
  • SELECT MAX(...) FROM ... est une bonne solution, simple et rapide, à condition que votre séquence soit liée à cette table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X