【发布时间】:2016-07-21 08:30:46
【问题描述】:
我一直在尝试创建一个使用音序器返回新角色 ID 的函数。然而,似乎 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;
我想到的最好的选择是有一个包含当前序列号的额外表。然后只需调整函数以使用它而不是排序器(我会在读取稳定性隔离级别下选择当前值以确保它是多线程安全的)。
【问题讨论】:
-
有什么理由不能在计划调用函数的任何地方使用连接表达式本身?顺便说一句,你见过built-in function
DIGITS()吗? -
我可以在我们使用音序器的地方使用它,但我不满意在我们使用它的任何地方都有笨重的 RIGHT BiF。我怎么不知道 DIGITS 功能,这是一种更简洁的方法。谢谢你提供的详情。我会用它来解决我的问题。
标签: sql db2 db2-luw database-sequence