Как использовать CASE-оператор для генерации различных последовательностей согласно заданному условию - PullRequest
1 голос
/ 07 марта 2020

Я хочу сгенерировать последовательность, сопоставив данное условие. У меня есть две последовательности в условии case и в зависимости от условия теста запрос должен генерировать соответствующую последовательность. Однако даже если выходные данные верны, обе последовательности генерируются, что приводит к ошибке пропущенной последовательности. Есть ли способ, чтобы было выполнено только условие теста успеха? Ниже приведен запрос, используемый в oracle DB.

select CASE
    WHEN :x=7
    THEN seq1.NEXTVAL
    ELSE seq2.NEXTVAL
END output from dual;

Предположим, что я передал x input как 7, я получу следующее значение seq1 в качестве вывода, что является правильным, однако следующее значение для seq2 также генерируется в back конец и пропущенный следующий раз, когда генерируется последовательность. Мне нужно это условие для одитинга.

1 Ответ

0 голосов
/ 07 марта 2020

Вы уже знаете, что происходит с вашим кодом. Посмотрите, поможет ли это.

Сначала создайте обе последовательности:

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). Таким образом, это может быть обходной путь для вашей проблемы.


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

...