Вы можете попробовать это
1 MERGE
2 INTO target_table tgt
3 USING source_table src
4 ON ( src.object_id = tgt.object_id )
5 WHEN MATCHED
6 THEN
7 UPDATE
8 SET tgt.object_name = src.object_name
9 , tgt.object_type = src.object_type
10 WHEN NOT MATCHED
11 THEN
12 INSERT ( tgt.object_id
13 , tgt.object_name
14 , tgt.object_type )
15 VALUES ( src.object_id
16 , src.object_name
17 , src.object_type );
Синтаксис на первый взгляд выглядит немного устрашающе, но если мы читаем сверху вниз, он довольно интуитивно понятен. Обратите внимание на следующие пункты:
• MERGE (строка 1): как указывалось ранее, теперь это 4-й оператор DML в Oracle. Любые подсказки, которые мы могли бы добавить, следуют непосредственно за этим ключевым словом (т. Е. MERGE / * + HINT * /);
• INTO (строка 2): так мы указываем цель для MERGE. Цель должна быть либо таблицей, либо обновляемым представлением (здесь нельзя использовать встроенное представление);
• USING (строка 3): предложение USING представляет исходный набор данных для MERGE. Это может быть одна таблица (как в нашем примере) или встроенное представление;
• ON () (строка 4): в предложении ON мы предоставляем соединение между исходным набором данных и целевой таблицей. Обратите внимание, что условия соединения должны быть в скобках;
• WHEN MATCHED (строка 5): в этом разделе мы сообщаем Oracle, что делать, когда у нас уже есть совпадающая запись в целевой таблице (т. Е. Существует соединение между исходным и целевым наборами данных). Мы явно хотим ОБНОВЛЕНИЕ в этом случае. Одно из ограничений этого пункта заключается в том, что мы не можем обновить ни один из столбцов, используемых в предложении ON (хотя, конечно, нам это не нужно, поскольку они уже совпадают). Любая попытка включить столбец соединения вызовет исключение неинтуитивного неверного идентификатора; и
• ЕСЛИ НЕ СОГЛАСОВАНО (строка 10): в этом пункте мы ВСТАВЛЯЕМ записи, для которых нет текущего совпадения.