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