Я пытался создать функцию, которая использует секвенсор для возврата нового идентификатора символа. Однако похоже, что DB2 не допускает этого в операторах CREATE FUNCTION. Я изо всех сил пытаюсь понять, зачем они это сделали, единственная документация, которая у них есть, это:
Выражения NEXT VALUE и PREVIOUS VALUE не могут быть указаны (SQLSTATE 428F9) в следующих местах:
- ...
- Оператор CREATE FUNCTION
- ... https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0023464.html
Есть ли какой-либо альтернативный способ выполнения следующих задач, который будет безопасным для потоков и не требует интенсивной обработки?
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;
Лучшая альтернатива, о которой я подумал, - это иметь дополнительную таблицу, которая будет содержать текущий порядковый номер. А затем просто настройте функцию, чтобы использовать это вместо секвенсора (я бы выбрал текущее значение в разделе Уровень изоляции стабильности чтения, чтобы убедиться, что он многопоточный).
DIGITS()
, кстати? - person mustaccio   schedule 21.07.2016