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.

1voto

Fabien Haddadi Points 388

Si votre cas d'utilisation est qu'un code backend insère un enregistrement, et que ce même code veut récupérer le dernier identifiant d'insertion, sans compter sur une fonction prédéfinie de la bibliothèque d'accès aux données sous-jacente pour le faire, alors, comme d'autres l'ont mentionné, vous devriez simplement élaborer votre requête SQL en utilisant SEQ_MY_NAME.NEXTVAL pour la colonne que vous voulez (généralement la clé primaire), puis exécutez simplement l'instruction SELECT SEQ_MY_NAME.CURRVAL FROM dual depuis le backend.

Rappelez-vous, CURRVAL n'est appelable que si NEXTVAL a été préalablement invoqué, ce qui est naturellement fait dans la stratégie ci-dessus...

0 votes

Eh bien, cela fonctionne pour mon cas d'utilisation. Donc celui qui m'a rétrogradé devrait élaborer son action avec une raison valable s'il vous plaît...

-2voto

georgejo Points 9

Ma réponse originale était factuellement incorrecte et je suis heureux qu'elle ait été supprimée. 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 sûr que l'hypothèse est vraie.

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

Malheureusement, si vous n'avez pas modifié la séquence dans votre session, je crois que les autres ont raison de dire que le NEXTVAL est la seule solution possible.

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