Oracle: ПРИ ДВОЙНОМ ОБНОВЛЕНИИ КЛЮЧА

Я пытаюсь реализовать решение, которое я нашел здесь от Michiel de Mare, чтобы обновить несколько записей одной (желательно простой -в-синтаксическом-смысле) запрос. Пример кода, который я пытаюсь изучить, выглядит так:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12) ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);

Я использую Oracle (и пока плохо разбираюсь в SQL-запросах).

Основываясь на некотором динамическом содержимом, я объединил свой запрос, аналогичный приведенному выше. Он может различаться по длине в зависимости от того, сколько записей я обновляю, но это пример сгенерированного мной запроса:

INSERT INTO my_table (question_id,ug) VALUES (30,0),(31,1) ON DUPLICATE KEY UPDATE ug=VALUES(ug) 

В приведенном выше запросе возникает эта ошибка:

Native message: ORA-00933: SQL command not properly ended

Я имею дело с системой управления контентом, в которой есть вызов функции, выполняющий запросы; в этих рамках. Я не думаю, что это уместно, но мне никогда не приходилось ставить ';' однако в конце запросов я пробовал использовать точку с запятой и без нее.


person John    schedule 22.06.2013    source источник
comment
Какой запрос вызывает сообщение об ошибке?   -  person Andy G    schedule 22.06.2013
comment
@ Андрей, я редактировал вопрос.   -  person John    schedule 22.06.2013
comment
Хорошо, но A1ex07 ответил на ваш вопрос.   -  person Andy G    schedule 22.06.2013
comment
Спасибо, ваш вопрос на самом деле был ответом на то, как динамически установить ON DUPLICATE UPDATE x)   -  person jave.web    schedule 19.12.2013


Ответы (1)


В Oracle нет on duplicate key update Используйте вместо этого MERGE:

MERGE INTO my_table trg  
USING (SELECT 30 as question_id,0 as ug FROM DUAL
UNION ALL 
SELECT 31,1 FROM DUAL) src ON (src.question_id = trg.question_id)
WHEN NOT MATCHED THEN INSERT(question_id, ug) VALUES
(src.question_id, src.ug)
WHEN MATCHED THEN UPDATE
SET trg.ug = src.ug
person a1ex07    schedule 22.06.2013
comment
@mauek unak: в базе данных Oracle нет ON DUPLICATE KEY UPDATE. Речь идет о базе данных Oracle, а не о Mysql, принадлежащем корпорации Oracle. Предоставленная вами документация касается Mysql 5.1. :) - person a1ex07; 12.04.2016