Как получить текущее значение последовательности oracle без ее увеличения?
есть ли инструкция SQL для получения значения последовательность, которая не увеличивает его.
спасибо.
РЕДАКТИРОВАНИЕ И ЗАКЛЮЧЕНИЕ
Как заявил Джастин Кейв это не полезно, чтобы попытаться "сохранить" порядковый номер так
select a_seq.nextval from dual;
достаточно хорошо, чтобы проверить значение последовательности.
Я все еще держу ответ Олли как хороший, потому что он ответил на первоначальный вопрос. но спросите себя о необходимости не изменение последовательности, если вы когда-нибудь захотите это сделать.
3 ответа:
SELECT last_number FROM all_sequences WHERE sequence_owner = '<sequence owner>' AND sequence_name = '<sequence_name>';
вы можете получить различные метаданные последовательности от
user_sequences
,all_sequences
иdba_sequences
.эти представления работают в разных сеансах.
EDIT:
если последовательность в схеме по умолчанию:
SELECT last_number FROM user_sequences WHERE sequence_name = '<sequence_name>';
если вы хотите, чтобы все ссылки:
SELECT * FROM user_sequences WHERE sequence_name = '<sequence_name>';
надеюсь, что это помогает...
EDIT2:
длинный извилистый способ сделать это более надежно, если ваш размер кэша не было бы 1:
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.
просто помните, что если другие используют последовательности в течение этого времени они (или вы) может получить
ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated
кроме того, вы можете установить кэш в
NOCACHE
до сброса, а затем обратно к исходному значению, чтобы убедиться, что вы не кэшировали много значений.
select MY_SEQ_NAME.currval from DUAL;
имейте в виду, что это работает только если вы запускали
select MY_SEQ_NAME.nextval from DUAL;
в текущей сессии.
мой первоначальный ответ был фактически неверным, и я рад, что он был удален. Приведенный ниже код будет работать при следующих условиях a) вы знаете, что никто больше не изменял последовательность b) последовательность была изменена вашим сеансом. В моем случае я столкнулся с аналогичной проблемой, когда я вызывал процедуру, которая изменила значение, и я уверен, что предположение верно.
SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;
к сожалению, если вы не изменили последовательность в своей сессии, я считаю, что другие правы в утверждении что следующий этап-это единственный путь.