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

时间:2016-02-10 14:49:38

标签: db2

请帮我将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()之后执行两次INSERTS

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。

2 个答案:

答案 0 :(得分:0)

另一种方法是做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中选择的选项。

答案 1 :(得分:0)

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

例如:

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;