0

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

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

4

1 回答 1

0

我仍然不确定为什么 CREATE FUNCTION 不允许使用 NEXT VALUE,但是在mustaccio向我展示了DIGITS() 内置函数之后,我将使用它作为解决方案,因为它比我的RIGHT() 内置函数更简洁功能使用。

创建序列器:

CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100

一个示例用法:

VALUES (DIGITS(NEXT VALUE FOR someid))

结果:

"00000000000000000000000000000000001"
于 2016-07-22T04:40:52.137 回答