【问题标题】:Why isn't NEXT VALUE allowed in CREATE FUNCTION statements?为什么 CREATE FUNCTION 语句中不允许使用 NEXT VALUE?
【发布时间】:2016-07-21 08:30:46
【问题描述】:

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

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

【问题讨论】:

  • 有什么理由不能在计划调用函数的任何地方使用连接表达式本身?顺便说一句,你见过built-in function DIGITS() 吗?
  • 我可以在我们使用音序器的地方使用它,但我不满意在我们使用它的任何地方都有笨重的 RIGHT BiF。我怎么不知道 DIGITS 功能,这是一种更简洁的方法。谢谢你提供的详情。我会用它来解决我的问题。

标签: sql db2 db2-luw database-sequence


【解决方案1】:

我仍然不确定为什么 CREATE FUNCTION 不允许使用 NEXT VALUE,但是在 mustaccio 向我展示了 DIGITS() built-in function 我将使用它作为解决方案,因为它比我的 @987654324 更整洁@built-in function 用法。

创建序列器:

CREATE SEQUENCE someid AS DECIMAL(35) CACHE 100

示例用法:

VALUES (DIGITS(NEXT VALUE FOR someid))

结果:

"00000000000000000000000000000000001"

【讨论】:

  • 请稍等:你用这个值做什么?你需要一个严格递增的无间隙序列吗?那么你不仅需要一个单独的表,there's quite a bit more to worry about(SQL Server,但问题是普遍的)。如果您不关心数据库崩溃或插入回滚时会发生什么,那么这可能没问题。
  • 感谢发条缪斯的评论。我们不需要无间隙序列,所以我们可以使用序列器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2021-10-29
  • 2011-02-12
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多