2015-12-20 1 views
0

Я создал последовательность по следующему утверждению:не удается вставить несколько значений в DB2 с помощью UNION ALL и генерировать идентификаторы из последовательности

CREATE SEQUENCE MAIN.MY_SEQUENCE START WITH 1 INCREMENT BY 1 CACHE 50; 

И таблица по следующему утверждению:

CREATE TABLE MAIN.EMPLOYEES(
     ID INTEGER NOT NULL, 
     NAME VARCHAR(512), 
     EMAIL VARCHAR(254), 

     PRIMARY KEY (ID) 
) 

сейчас когда я пытаюсь вставить новую запись, используя следующее заявление:

INSERT INTO MAIN EMPLOYEES (ID, NAME, EMAIL) 
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', '[email protected]') UNION ALL 
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', '[email protected]') 

Я получаю сообщение об ошибке:

"NEXTVAL FOR MAIN.MY_SEQUENCE.NEXTVAL" cannot be specified in this context.. SQLCODE=-348, SQLSTATE=428F9, DRIVER=4.17.30 

Когда я пытаюсь вставить одну строку, все работает нормально.

Я нашел список ограничений по использованию NEXT VALUEhere, но здесь не упомянуто мое дело или я не смог найти его.

Мой вопрос: возможно ли вставить несколько строк с использованием идентификатора из последовательности, и если да, то как я могу его достичь?

ответ

1

Это список вашего дела. Документация содержит следующее:

The NEXT VALUE expressions cannot be specified in the following contexts:
...
•SELECT statement for which the outer SELECT is combined with another SELECT statement using a set operator such as UNION, EXCEPT, or INTERSECT
....

(курсив мой) Это утверждение не является исчерпывающим, и потому UNION ALL считается уставке, операция исключается.

Это должно быть исправлено - я немного удивлен, что вы написали заявление так, как вы это делали; DB2 позволяет вам разделять запятые строки данных. То есть, следующий должен быть действительным:

INSERT INTO MAIN.EMPLOYEES (ID, NAME, EMAIL) 
VALUES (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 1', '[email protected]'), 
     (MAIN.MY_SEQUENCE.NEXTVAL, 'Name 2', '[email protected]') 
+0

Спасибо, ваше решение правильно, но 'VALUES' должен быть указан только один раз, в противном случае я получаю сообщение об ошибке' Нет авторизованной подпрограммы «ЦЕННОСТИ» типа «FUNCTION», не имеющий были найдены совместимые аргументы. SQLCODE = -440, SQLSTATE = 42884, DRIVER = 4.17.30. Что касается вашего утверждения SELECT, для которого внешний SELECT объединяется с другим SELECT ... 'почему мой оператор' INSERT' считается 'SELECT' Я не понял этого момента. – Anatoly

+0

.... Я хотел написать это, да. Я считаю, что утверждение считается неявным выражением 'SELECT', да, потому что это ярлык. Важной частью является заданная операция. –

Смежные вопросы