DB2 在初始插入后使用 IDENTITY_VAL_LOCAL() 两次

DB2 use IDENTITY_VAL_LOCAL() twice after the initial insert

请帮助我将 IDENTITY_VAL_LOCAL() 检索到一个变量中并在其他 INSERT 语句中使用它。以下无效:

INSERT INTO SCH1.CONF_GROUP(CONFIG_GROUP_NAME) VALUES('Item1'); --Generates identity OK
SET :IVAR = IDENTITY_VAL_LOCAL(); --OK
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) VALUES(:IVAR, 'token', ''); --FAILS
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) VALUES(:IVAR, 'name', '');

以下工作,但我需要在检索 IDENTITY_VAL_LOCAL()

后执行两次插入
INSERT INTO SCH1.CONF_GROUP(CONFIG_GROUP_NAME) VALUES('Item1'); --OK
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) VALUES(IDENTITY_VAL_LOCAL(), 'token', ''); --IDENTITY_VAL_LOCAL() contains a value
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) VALUES(IDENTITY_VAL_LOCAL(), 'name', ''); --IDENTITY_VAL_LOCAL() is null

亲切的问候 A.H.

另一种方法是 SELECT FROM INSERT

SELECT id
INTO :IVAR
FROM FINAL TABLE (
    INSERT INTO SCH1.CONF_GROUP(CONFIG_GROUP_NAME) VALUES('Item1');
)

这里是 an article 关于您必须从 INSERT/UPDATE/DELETE 执行 select 的选项。

我的印象是无法在控制中心的动态 SQL 中使用主机变量。 所以我通过使用 SELECT MAX() 解决了它,因为我无处可去,需要一个快速的解决方法。我知道这不是防弹解决方案,因为其他人可能 运行 INSERT in SCH1.CONF_GROUP 而 INSERT INTO SCH1.CONF 是 运行ning 从而返回错误的 MAX() 值。但是这个脚本将 运行 仅通过一个数据库 connection/session 在一个新数据库上运行,所以我不认为会发生错误情况。

例如:

INSERT INTO SCH1.CONF_GROUP(CONFIG_GROUP_NAME) VALUES('Item1');
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) SELECT MAX(CONFIG_GROUP_ID), 'token', '' FROM SCH1.CONF_GROUP;
INSERT INTO SCH1.CONF(GROUP_ID, NAME, CVALUE) SELECT MAX(CONFIG_GROUP_ID), 'name', '' FROM SCH1.CONF_GROUP;