为什么 CREATE FUNCTION 语句中不允许使用 NEXT VALUE?
Why isn't NEXT VALUE allowed in CREATE FUNCTION statements?
我一直在尝试创建一个使用音序器 return 新角色 ID 的函数。但是,似乎 DB2 不允许在 CREATE FUNCTION 语句中使用它。我很难理解他们为什么要这样做,他们拥有的唯一文档是:
NEXT VALUE and PREVIOUS VALUE expressions cannot be specified (SQLSTATE 428F9) in the following places:
- ...
- CREATE FUNCTION statement
- ...
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;
我想到的最佳选择是有一个额外的 table 来包含当前序列号。然后只需调整函数以使用它而不是定序器(我会 select 读取稳定性隔离级别下的当前值以确保它是多线程安全的)。
我仍然不确定为什么 CREATE FUNCTION 不允许使用 NEXT VALUE,但是在 mustaccio showed me the DIGITS() built-in function I will be using that as a solution as it is much neater than my RIGHT() built-in function 使用之后。
正在创建音序器:
CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100
用法示例:
VALUES (DIGITS(NEXT VALUE FOR someid))
结果:
"00000000000000000000000000000000001"
我一直在尝试创建一个使用音序器 return 新角色 ID 的函数。但是,似乎 DB2 不允许在 CREATE FUNCTION 语句中使用它。我很难理解他们为什么要这样做,他们拥有的唯一文档是:
NEXT VALUE and PREVIOUS VALUE expressions cannot be specified (SQLSTATE 428F9) in the following places:
- ...
- CREATE FUNCTION statement
- ... 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;
我想到的最佳选择是有一个额外的 table 来包含当前序列号。然后只需调整函数以使用它而不是定序器(我会 select 读取稳定性隔离级别下的当前值以确保它是多线程安全的)。
我仍然不确定为什么 CREATE FUNCTION 不允许使用 NEXT VALUE,但是在 mustaccio showed me the DIGITS() built-in function I will be using that as a solution as it is much neater than my RIGHT() built-in function 使用之后。
正在创建音序器:
CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100
用法示例:
VALUES (DIGITS(NEXT VALUE FOR someid))
结果:
"00000000000000000000000000000000001"