Существует ли инструкция SQL для получения значения последовательности, которая не увеличивает его.
Спасибо.
РЕДАКТИРОВАТЬ И ЗАКЛЮЧЕНИЕ
Как утверждает Джастин Кейв, не стоит пытаться «сохранить» порядковый номер так
select a_seq.nextval from dual;
достаточно для проверки значения последовательности.
Я до сих пор считаю ответ Олли хорошим, потому что он ответил на первый вопрос. но спросите себя о необходимости не изменять последовательность, если вы когда-нибудь захотите это сделать.
nextval
последовательности для проверки? Вы не предполагаете, что последовательности будут без пропусков, верно? Так что «потеря» значения последовательности не должна быть проблемой.Ответы:
Вы можете получить различные метаданные последовательности из
user_sequences
,all_sequences
иdba_sequences
.Эти представления работают через сеансы.
РЕДАКТИРОВАТЬ:
Если последовательность находится в вашей схеме по умолчанию, то:
Если вы хотите все метаданные, то:
Надеюсь, поможет...
EDIT2:
Долгосрочный способ сделать это более надежно, если ваш размер кэша не равен 1, будет:
Просто знайте, что если другие используют последовательность в течение этого времени - они (или вы) могут получить
Кроме того, вы можете установить кэш
NOCACHE
до сброса, а затем вернуться к его первоначальному значению, чтобы убедиться, что вы не кэшировали много значений.источник
ALL_SEQUENCES
это вид. Если у вас нет доступа к нему, попробуйте выбрать,USER_SEQUENCES
если последовательность находится в вашей схеме по умолчанию. (Вам не понадобитсяsequence_owner = '<sequence_owner>'
пункт дляUSER_SEQUENCES
).LAST_NUMBER
inALL_SEQUENCES
не будет последним номером, который фактически был дан сеансу, и не будет номером, который будет возвращенsequence_name.nextval
при общем вызове . Предполагая, что вы установили последовательностьCACHE
более 1 (по умолчанию 20),LAST_NUMBER
будет последним числом в кэше. Нет никакой гарантии, что этот номер когда-либо будет предоставлен какой-либо сессии.ALTER SEQUENCE seq INCREMENT BY -1;
будет проблемой, если никто не может гарантировать , что ни один другой сеанс не будет вызыватьсяseq.nextval
. В противном случае последовательность будет раздавать повторяющиеся значения, что обычно не то, что нужно.select MY_SEQ_NAME.currval from DUAL;
Имейте в виду, что это работает, только если вы работали
select MY_SEQ_NAME.nextval from DUAL;
в текущих сеансах.источник
Мой первоначальный ответ был фактически неверным, и я рад, что его удалили. Приведенный ниже код будет работать при следующих условиях: а) вы знаете, что никто не изменил последовательность б) последовательность была изменена вашим сеансом. В моем случае я столкнулся с аналогичной проблемой, когда я вызывал процедуру, которая изменила значение, и я уверен, что предположение верно.
К сожалению, если вы не изменили последовательность в своем сеансе, я считаю, что другие правы, заявив, что NEXTVAL - единственный путь.
источник
На самом деле это не ответ, и я бы написал его как комментарий, если бы вопрос не был заблокирован. Это отвечает на вопрос:
Зачем тебе это?
Предположим, у вас есть таблица с последовательностью в качестве первичного ключа, и последовательность генерируется триггером вставки. Если вы хотите, чтобы последовательность была доступна для последующих обновлений записи, вам нужен способ извлечь это значение.
Чтобы убедиться, что вы получите правильный вариант, вы можете заключить запрос INSERT и RonK в транзакцию.
Запрос RonK:
В приведенном выше сценарии предупреждение RonK не применяется, поскольку вставка и обновление будут происходить в одном сеансе.
источник
Я также попытался использовать CURRVAL, в моем случае, чтобы выяснить, вставил ли какой-то процесс новые строки в какую-либо таблицу с такой последовательностью в качестве Первичного ключа. Я предполагал, что CURRVAL будет самым быстрым методом. Но a) CurrVal не работает, он просто получит старое значение, потому что вы находитесь в другом сеансе Oracle, пока вы не выполните NEXTVAL в своем собственном сеансе. И б) а
select max(PK) from TheTable
также очень быстро, вероятно, потому что ПК всегда индексируется. Илиselect count(*) from TheTable
. Я все еще экспериментирую, но оба SELECT кажутся быстрыми.Я не возражаю против пробела в последовательности, но в моем случае я много думал об опросе, и я бы не хотел представлять себе очень большие пробелы. Особенно, если простой SELECT будет таким же быстрым.
Вывод:
источник