Oracle: последовательность MySequence.currval еще не определена в этом сеансе

Что это значит и как я могу обойти это?

SELECT MySequence.CURRVAL FROM DUAL;

Результат:

ORA-08002: последовательность MySequence.CURRVAL еще не определена в этом сеансе

Ответ 1

mysequence.CURRVAL возвращает последнее значение, полученное из последовательности mysequence в вашей сессии, и, следовательно, не определено до тех пор, пока вы не получите значение, используя mysequence.NEXTVAL, по крайней мере, один раз в сеансе. Цель CURRVAL - позволить вам использовать значение последовательности более одного раза в вашем коде, например.

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

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

Если CURRVAL вернул последнее значение, полученное из последовательности, с помощью любой сессии, тогда это было бы бесполезно в приведенном выше коде и фактически могло привести к повреждению данных!

Ответ 2

Оказывается, вы не можете использовать CURRVAL, пока не используете NEXTVAL хотя бы один раз в своей сессии.

Ответ 3

используйте этот

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'

Ответ 4

Дуга,

Реальный вопрос, почему вам нужен currval, когда вы не использовали nextval в своей сессии? Вы можете посмотреть столбец LAST_NUMBER в представлении USER/ALL/DBA_SEQUENCES, но подумайте о проблемах concurrency, когда вы начнете использовать это.

С уважением, Роб.

Ответ 5

select * from user_sequences     where sequence_name='SEQ_V_WORKORDER_RECNO';

в приведенном выше запросе SEQ_V_WORKORDER_RECNO мое имя последовательности заменяет его именем последовательности