Почему в операторах CREATE FUNCTION нельзя использовать NEXT VALUE?

Я пытался создать функцию, которая использует секвенсор для возврата нового идентификатора символа. Однако похоже, что DB2 не допускает этого в операторах CREATE FUNCTION. Я изо всех сил пытаюсь понять, зачем они это сделали, единственная документация, которая у них есть, это:

Выражения NEXT VALUE и PREVIOUS VALUE не могут быть указаны (SQLSTATE 428F9) в следующих местах:

Есть ли какой-либо альтернативный способ выполнения следующих задач, который будет безопасным для потоков и не требует интенсивной обработки?

CREATE SEQUENCE qgpl.someid AS BIGINT CACHE 100;

И функция:

CREATE OR REPLACE FUNCTION qgpl.GetNextMandateNumber ()
RETURNS CHAR(35)
BEGIN
  RETURN RIGHT('00000000000000000000000000000000000' ||
    VARCHAR(NEXT VALUE FOR qgpl.someid), 35);
END;

Лучшая альтернатива, о которой я подумал, - это иметь дополнительную таблицу, которая будет содержать текущий порядковый номер. А затем просто настройте функцию, чтобы использовать это вместо секвенсора (я бы выбрал текущее значение в разделе Уровень изоляции стабильности чтения, чтобы убедиться, что он многопоточный).


person Adrian Bannister    schedule 21.07.2016    source источник
comment
Есть ли причина, по которой вы не можете использовать само конкатенированное выражение, где бы вы ни планировали вызвать свою функцию? Вы видели встроенная функция DIGITS(), кстати?   -  person mustaccio    schedule 21.07.2016
comment
Я мог бы использовать его там, где мы используем секвенсор, но меня не устраивало наличие громоздкого ПРАВИЛЬНОГО BiF везде, где мы его используем. Как бы то ни было, я не знал о функции ЦИФРЫ, это гораздо более аккуратный способ сделать это. Спасибо за информацию. Я воспользуюсь этим, чтобы решить свою проблему.   -  person Adrian Bannister    schedule 22.07.2016


Ответы (1)


Я до сих пор не уверен, почему СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ нельзя использовать с CREATE FUNCTION, но после того, как mustaccio показал мне ЦИФРЫ () встроенная функция Я буду использовать ее как решение, так как она намного удобнее, чем моя ВПРАВО () использование встроенной функции.

Создание секвенсора:

CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100

Пример использования:

VALUES (DIGITS(NEXT VALUE FOR someid))

Результат:

"00000000000000000000000000000000001"
person Adrian Bannister    schedule 22.07.2016
comment
Подождите немного: для чего вы используете это значение? Вам нужна строго возрастающая последовательность без пропусков? Тогда вам понадобится не только отдельная таблица, тут есть о чем беспокоиться (SQL Server, но проблема универсальна). Если вас не волнует, что происходит при сбое базы данных или откате вставки, то, вероятно, это нормально. - person Clockwork-Muse; 24.07.2016
comment
Спасибо за комментарий Clockwork-Muse. Нам не нужна последовательность без промежутков, поэтому мы будем использовать секвенсор. - person Adrian Bannister; 25.07.2016