web-dev-qa-db-fra.com

Oracle: la séquence MySequence.currval n'est pas encore définie dans cette session

Qu'est-ce que cela signifie et comment puis-je me déplacer?

SELECT MySequence.CURRVAL FROM DUAL;

Résultat:

ORA-08002: la séquence MySequence.CURRVAL n'est pas encore définie dans cette session

37
Doug

mysequence.CURRVAL renvoie la dernière valeur obtenue à partir de la séquence mysequence dans la session your, et n'est donc pas définie tant que vous n'avez pas obtenu une valeur en utilisant mysequence.NEXTVAL au moins une fois dans la session. Le but de CURRVAL est de vous permettre d'utiliser la valeur de séquence plus d'une fois dans votre code, par ex.

insert into parent (parent_id, ...) values (mysequence.NEXTVAL, ...);

insert into child (parent_id, ...) values (mysequence.CURRVAL, ...);

Si CURRVAL vient de renvoyer la dernière valeur obtenue à partir de la séquence par any session, alors cela serait inutile dans le code ci-dessus, et pourrait en fait entraîner une corruption des données!

49
Tony Andrews

Il s'avère que vous ne pouvez pas utiliser CURRVAL avant d'avoir utilisé NEXTVAL au moins une fois dans votre session.

25
Doug

utilisez ceci

select sequence_name, 
   to_char(min_value) min_value,
   to_char(max_value) max_value, 
   increment_by,
   cycle_flag, 
   order_flag, 
   cache_size, 
   to_char(Last_number) last_number
from user_sequences
where sequence_name='MYSEQUENCE'
13
HainKurt

Doug,

La vraie question est pourquoi vous avez besoin du currval alors que vous n'avez pas utilisé de nextval dans votre session? Vous pouvez consulter la colonne LAST_NUMBER de la vue USER/ALL/DBA_SEQUENCES, mais pensez aux problèmes de concurrence lorsque vous commencez à l'utiliser.

Cordialement, Rob.

3
Rob van Wijk
select * from user_sequences     where sequence_name='SEQ_V_WORKORDER_RECNO';

dans la requête ci-dessus SEQ_V_WORKORDER_RECNO mon nom de séquence le remplacer par votre nom de séquence

2
Tarun Nigam