Как получить текущее значение последовательности 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;

к сожалению, если вы не изменили последовательность в своем сеансе, я считаю, что другие правы в утверждении что NEXTVAL-единственный путь.