Как вы можете создать последовательность с одним значением?

#oracle #sequence

#Oracle #последовательность

Вопрос:

В среде prod у нас есть огромная последовательность в поле (на данный момент 13 цифр). В среде разработки мы хотим игнорировать эту последовательность. Есть ли какой-нибудь способ создать последовательность, которая всегда возвращает одно и то же значение?

Я имею в виду, чтобы получить что-то вроде этого:

 select my_seq.CURRVAL from dual; --> E.G: 5
select my_seq.NEXTVAL from dual; --> E.G: 5
  

Я попытался установить приращение в 0, установив значение min_value равным max_value, но ничего не работает.
Спасибо.

[Отредактировано]-> Oracle 12c, и всегда должно быть одно и то же значение. Извините за последовательности 1-2-1-2, они не соответствуют нашим потребностям.

Комментарии:

1. Если вы хотите проигнорировать это, то почему значение, которое оно возвращает, имеет значение? Просто создайте обычную последовательность и игнорируйте значение

2. Я помню некоторые проблемы с последовательностями во время нагрузочных тестов с использованием RAT (real application testing) и HP Loadrunner. Насколько я помню, разработчикам пришлось переписать некоторые части функциональных тестов, чтобы избежать зависимостей от последовательностей. Они не изменили определения последовательностей, но они сбросили их до значений предварительных тестов при запуске

3. Эта последовательность является частью значения аудита. В prod это полезно, но в других средах мы обрабатываем записи дважды и хотим проверить, есть ли какие-либо другие различия, кроме этой последовательности.

4. Разве это не странное желание? Вы не рассказали всю историю до конца. Что вы подразумеваете под игнорированием? Какую выгоду вы получаете от этого?

5. мы осуществляем «двойную обработку»: с нашими изменениями и без них. Если у нас одинаковое значение в полях, большинство записей должно быть одинаковым.

Ответ №1:

Последовательность с одним значением может быть создана с помощью неподдерживаемого и потенциально опасного ручного изменения словаря данных. Используйте это решение только в крайнем случае, никогда не запускайте его в рабочей среде, тщательно протестируйте его в изолированной базе данных, прежде чем запускать его в dev, и документируйте изменения, чтобы будущие разработчики могли понять, почему это было сделано.

Вы не можете напрямую создать нужную последовательность, поэтому сначала вы должны создать последовательность, которая довольно близка — начальная последовательность начинается с 5, увеличивается на 1 и циклически изменяется между 4 и 5. После создания допустимой последовательности обновите SYS.SEQ$.MINVALUE , чтобы создать последовательность, которая каждый раз возвращается к одному и тому же номеру. Наконец, вы должны зафиксировать и немедленно перезапустить базу данных перед использованием последовательности. (Я не уверен, почему, но если вы не перезапустите, Oracle изменит SYS.SEQ$.MINVALUE обратно на допустимое значение, как только вы используете последовательность.)

 SYS@orclpdb> create sequence jheller.my_seq start with 5 increment by 1 minvalue 4 maxvalue 5 cycle nocache;

Sequence created.

SYS@orclpdb> update sys.seq$ set minvalue = 5 where obj# = (select object_id from dba_objects where object_name = 'MY_SEQ' and owner = 'JHELLER');

1 row updated.

SYS@orclpdb> commit;

Commit complete.

SYS@orclpdb> shutdown immediate
Pluggable Database closed.
SYS@orclpdb> startup
Pluggable Database opened.
SYS@orclpdb> select jheller.my_seq.nextval from dual;

   NEXTVAL
----------
         5

SYS@orclpdb> select jheller.my_seq.nextval from dual;

   NEXTVAL
----------
         5
  

Приведенный выше код работает для меня на 19c с опцией мультитенанта. Последовательности не используют никаких необычных новых функций, поэтому я думаю, что код должен работать для гораздо более старых версий Oracle. Но поскольку это неподдерживаемое изменение, я не могу давать никаких обещаний.

Другие идеи, которые не сработали (но, возможно, они побудят кого-то найти лучшее решение)

Вы не можете напрямую создать последовательность, которая вообще не увеличивается — это генерирует ошибку «ORA-04002: ПРИРАЩЕНИЕ должно быть ненулевым целым числом». Вы также не можете создать последовательность, которая напрямую возвращается к минимальному значению, что приводит к ошибке «ORA-04005: ПРИРАЩЕНИЕ должно быть меньше, чем MAXVALUE минус MINVALUE».

Трюки с перекрывающимися именами также не работают. Хотя допустимо создать пакет с именем MY_SEQ с функциями с именами CURRVAL и NEXTVAL, анализатор все равно будет ожидать последовательность, когда увидит выражение MY_SEQ.NEXTVAL . Та же проблема также относится к созданию пользователя с именем MY_SEQ с двумя функциями для CURRVAL и NEXTVAL.

Комментарии:

1. Большое вам спасибо. Это должно сработать, но я думаю, что Оракул может в любой момент отменить его.

Ответ №2:

Не одно и то же значение, а только 1 и 2:

 SQL> create sequence my_seq START WITH 1 minvalue 1 maxvalue 2 cycle session nocache;

Sequence created.

SQL> select my_seq.nextval from dual connect by level<=5;

   NEXTVAL
----------
         1
         2
         1
         2
         1
  

ПРИМЕЧАНИЕ: session последовательности требуют Oracle >= 12.1

Комментарии:

1. Извините, это решение для нас бесполезно.

2. @Jose хорошо, итак, единственный способ для вас — alter sequence после каждого запуска: либо каждый раз изменять increment by между 1 и -1, либо изменять start with

Ответ №3:

Это работает в 10g, 11g, 12c (у меня нет других версий, чтобы попробовать это, но я предполагаю, что все должно быть в порядке).

 SQL> create sequence my_seq minvalue 0 maxvalue 1 nocache cycle;

Sequence created.

SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
         0

SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
         1

SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
         0

SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
         1

SQL>
  

Хотя, как прокомментировал @a_horse, зачем вообще беспокоиться?

Комментарии:

1. session последовательности намного быстрее, поскольку у них нет параллелизма между сеансами, поэтому я предлагаю использовать их на 12

2. К сожалению, в OP не указано, какую версию они используют, @Sayan. Я все еще согласен с a_horse, что это более или менее бессмысленно.

3. Я помню некоторые проблемы с последовательностями во время нагрузочных тестов с использованием RAT (real application testing) и HP Loadrunner. Насколько я помню, разработчикам пришлось переписать некоторые части функциональных тестов, чтобы избежать зависимостей от последовательностей. Они не изменили определения последовательностей, но они сбросили их до значений предварительных тестов при запуске

4. Извините, это решение для нас бесполезно.

5. Не волнуйся, это у тебя есть проблема. Хотя, возможно, вы не сможете решить ее так просто, как хотелось бы. В любом случае, удачи!