Вы уже знаете, что происходит с вашим кодом. Посмотрите, поможет ли это.
Сначала создайте обе последовательности:
SQL> create sequence seq1;
Sequence created.
SQL> create sequence seq2;
Sequence created.
Теперь создайте две функции, по одной для каждой последовательности:
SQL> create or replace function f1 return number as begin return seq1.nextval; end;
2 /
Function created.
SQL> create or replace function f2 return number as begin return seq2.nextval; end;
2 /
Function created.
Запустите select
заявление несколько раз; один раз с входным значением 7
и несколько раз с другими значениями. Но не выбирайте напрямую из последовательности - используйте вместо этого функции:
SQL> select case when &x = 7 then f1
2 else f2
3 end result
4 from dual;
Enter value for x: 7
old 1: select case when &x = 7 then f1
new 1: select case when 7 = 7 then f1
RESULT
----------
1
SQL> /
Enter value for x: 2
old 1: select case when &x = 7 then f1
new 1: select case when 2 = 7 then f1
RESULT
----------
1
SQL> /
Enter value for x: 3
old 1: select case when &x = 7 then f1
new 1: select case when 3 = 7 then f1
RESULT
----------
2
SQL> /
Enter value for x: 4
old 1: select case when &x = 7 then f1
new 1: select case when 4 = 7 then f1
RESULT
----------
3
SQL> /
Enter value for x: 5
old 1: select case when &x = 7 then f1
new 1: select case when 5 = 7 then f1
RESULT
----------
4
OK; давайте теперь проверим значения последовательности:
SQL> select seq1.currval, seq2.currval from dual;
CURRVAL CURRVAL
---------- ----------
1 4
Ага! Они не совпадают с тем, как они использовали ваш код (т.е. имеют последовательности в операторе select
). Таким образом, это может быть обходной путь для вашей проблемы.
Однако , последовательности не должны использоваться, если вы хотите список чисел без пробелов. Это обеспечит уникальность, это точно, но - вы, скорее всего, не сможете избежать пробелов.