我一直在尝试创建一个使用音序器返回新字符ID的函数。但是,似乎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;
我想到的最好的替代方案是有一个包含当前序列号的额外表。然后调整函数来使用它而不是音序器(我会在读稳定性隔离级别下选择当前值以确保它的多线程安全)。
答案 0 :(得分:0)
我仍然不确定为什么CREATING FUNCTION不允许使用NEXT VALUE,但在mustaccio向我显示DIGITS() built-in function后我将使用它作为解决方案,因为它是比RIGHT() built-in function使用更加整洁。
创建音序器:
CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100
示例用法:
VALUES (DIGITS(NEXT VALUE FOR someid))
结果:
"00000000000000000000000000000000001"