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;
请帮助我将 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;