2016-02-10 2 views
-1

Pls поможет мне получить IDENTITY_VAL_LOCAL() в переменной и использовать ее в дополнительных инструкциях INSERT. После не работает:DB2 использует IDENTITY_VAL_LOCAL() дважды после первоначальной вставки

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 

Сердечные приветы хиджры

+1

Какая платформа и версия DB2? Каково сообщение об ошибке, когда он не работает? Это не похоже на прямой SQL; так как похоже, что вы используете переменные хоста. На каком языке встроен SQL ?. – Charles

+0

DB2 9.7 в Windows, SQL отредактирован и запущен в Центре управления. Да, переменные хоста. Я буду запускать эти SQL-запросы raw, они не будут внедрены. – BTalker

ответ

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.

+0

Здесь вы получаете идентификационный номер. Но у меня нет проблем с использованием SET: IVAR = IDENTITY_VAL_LOCAL(); Он не работает в INSERT INTO SCH1.CONF (GROUP_ID, NAME, CVALUE) VALUES (: IVAR, 'токен', ''); потому что я использую: IVAR в заявлении INSERT. – BTalker

+0

Какая ошибка вы получаете? «Неудачи» довольно широкие ... – bhamby

+0

Разрешено ли использовать переменные хоста в простой инструкции INSERT (см. Пример), выполняемой в запросе в Центре управления? – BTalker

0

У меня сложилось впечатление, что невозможно использовать переменные хоста в динамическом SQL в Центре управления. Поэтому я решил это с помощью SELECT MAX(), так как я никуда не ухожу и нуждаюсь в быстром обходном пути. Я знаю, что это не пуленепробиваемое решение, так как кто-то еще может запускать INSERT в SCH1.CONF_GROUP, а 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; 
Смежные вопросы