Existe-t-il une instruction SQL pour récupérer la valeur d'une séquence qui ne l'incrémente pas.
Merci.
MODIFIER ET CONCLUSION
Comme indiqué par Justin Cave Il n'est pas utile d'essayer de "sauvegarder" le numéro de séquence afin
select a_seq.nextval from dual;
est assez bon pour vérifier une valeur de séquence.
Je garde toujours la réponse d'Ollie comme la bonne parce qu'elle a répondu à la question initiale. mais interrogez-vous sur la nécessité de ne pas modifier la séquence si jamais vous voulez le faire.
nextval
tester la séquence? Vous ne supposez pas que les séquences seront sans lacunes, non? Donc "gaspiller" une valeur de séquence ne devrait pas être un problème.Réponses:
Vous pouvez obtenir une variété de métadonnées de séquence à partir de
user_sequences
,all_sequences
etdba_sequences
.Ces vues fonctionnent à travers les sessions.
ÉDITER:
Si la séquence est dans votre schéma par défaut, alors:
Si vous voulez toutes les métadonnées, alors:
J'espère que ça aide...
EDIT2:
Une façon longue et fastidieuse de le faire de manière plus fiable si la taille de votre cache n'est pas de 1 serait:
Sachez simplement que si d'autres utilisent la séquence pendant ce temps, ils (ou vous) peuvent
En outre, vous pouvez définir le cache sur
NOCACHE
avant la réinitialisation, puis revenir à sa valeur d'origine par la suite pour vous assurer que vous n'avez pas mis en cache beaucoup de valeurs.la source
ALL_SEQUENCES
est une vue. Si vous n'y avez pas accès, essayez de sélectionnerUSER_SEQUENCES
si la séquence est dans votre schéma par défaut. (Vous n'aurez pas besoin de lasequence_owner = '<sequence_owner>'
clause pourUSER_SEQUENCES
).LAST_NUMBER
dansALL_SEQUENCES
ne sera pas le dernier numéro une session a été effectivement donnée et ne sera pas le nombre qui serait retourné d'un appel àsequence_name.nextval
en général. En supposant que vous ayez défini la séquence surCACHE
plus de 1 (la valeur par défaut est 20),LAST_NUMBER
sera le dernier numéro qui se trouve dans le cache. Il n'y a aucune garantie que ce numéro sera jamais donné à une session.ALTER SEQUENCE seq INCREMENT BY -1;
va être un problème à moins que l'on puisse garantir qu'aucune autre session n'appelleraseq.nextval
. Sinon, la séquence distribuera des valeurs en double, ce qui n'est généralement pas ce que l'on veut.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;
les sessions en cours.la source
Ma réponse initiale é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 convaincu que l'hypothèse est vraie.
Malheureusement, si vous n'avez pas modifié la séquence dans votre session, je pense que d'autres ont raison de dire que NEXTVAL est la seule façon de procéder.
la source
Ce n'est pas vraiment une réponse et je l'aurais saisie comme commentaire si la question n'avait pas été verrouillée. Cela répond à la question:
Pourquoi le voudrais-tu?
Supposons que vous ayez une table avec la séquence comme clé primaire et la séquence est générée par un déclencheur 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 de vous assurer que vous obtenez le bon, vous voudrez peut-être envelopper la requête INSERT et RonK dans une transaction.
Requête de RonK:
Dans le scénario ci-dessus, la mise en garde de RonK ne s'applique pas car l'insertion et la mise à jour se produiraient dans la même session.
la source
J'ai également essayé d'utiliser CURRVAL, dans mon cas pour savoir si un processus insérait de nouvelles lignes dans une table avec cette séquence comme clé primaire. Mon hypothèse était que CURRVAL serait la méthode la plus rapide. Mais a) CurrVal ne fonctionne pas, il récupérera 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é. Ouselect count(*) from TheTable
. J'expérimente toujours, mais les deux SELECT semblent rapides.Cela ne me dérange pas une interruption dans une séquence, mais dans mon cas, je pensais beaucoup aux sondages, et je détesterais l'idée de très grandes lacunes. Surtout si un simple SELECT serait tout aussi rapide.
Conclusion:
la source