为什么在CREATE FUNCTION语句中不允许使用NEXT VALUE?

时间:2016-07-21 08:30:47

标签: sql db2 db2-luw database-sequence

我一直在尝试创建一个使用音序器返回新字符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;

我想到的最好的替代方案是有一个包含当前序列号的额外表。然后调整函数来使用它而不是音序器(我会在读稳定性隔离级别下选择当前值以确保它的多线程安全)。

1 个答案:

答案 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"