Запросите несколько NEXTVAL из последовательности в одном операторе - PullRequest
22 голосов
/ 28 ноября 2011

По сути, мне нужно запросить около тысячи NEXTVAL из последовательности.Я могу запросить их в цикле или запросить их через объединение с большой таблицей.

Есть ли какой-нибудь менее хакерский способ?

Upd. В основномУ меня есть график операций на объектах.Каждый объект имеет сгенерированный UUID или идентификатор из базы данных.После того, как я рассчитал оптимальное расписание, мне нужно записать его в БД, но каждый идентификатор в таблице ДОЛЖЕН быть из последовательности.Поэтому мне нужно запросить некоторые идентификаторы из этой последовательности.Проблема в том, что циклический запрос медленный, поскольку БД очень далека от меня, и я не могу просто потерять несколько секунд, выполняя десятки запросов в цикле.Поэтому мне нужно запросить все эти новые идентификаторы в одном запросе.

Ответы [ 4 ]

34 голосов
/ 28 ноября 2011

Вы можете использовать это:

select your_sequence.nextval
from (
   select level 
   from dual 
   connect by level < 1000
);
15 голосов
/ 28 ноября 2011

Зависит от того, что вы хотите с ними делать.

Если вы вставите их в таблицу, вы можете отменить seq.nexval в запросе на вставку.(Как объясняется здесь: Как я могу вставить несколько строк в oracle со значением последовательности? )

Если вы используете их в цикле, вы можете извлечь их в этом цикле.

Что вы хотите с ними сделать?

Как я знаю, вы не можете извлечь несколько значений из последовательности.

ОБНОВЛЕНИЕ: a_horse_with_no_name aswer может бытьулучшено так:

select your_sequence.nextval
from dual 
connect by level < 1000

:)

0 голосов
/ 25 июня 2018

Моя (H2) база данных модульных тестов не поддерживала "connect by", поэтому мне пришлось придумать что-то еще:

    with temp_id_table (lvl) as 
       (select 1 as lvl from dual 
        union all 
        select lvl+1 
          from temp_id_table 
          where lvl < 1000) 
    select sequence_name.nextval 
    from temp_id_table;
0 голосов
/ 01 октября 2014
select sequence_name.nextval
from dual
connect by level < number of values you want to print;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...