Я использую первый образец кода в течение многих лет. Обратите внимание на notfound, а не на счет.
UPDATE tablename SET val1 = in_val1, val2 = in_val2
WHERE val3 = in_val3;
IF (sql%notfound) THEN
INSERT INTO tablename
VALUES (in_val1, in_val2, in_val3);
END IF;
Код ниже, возможно, это новый и улучшенный код
MERGE INTO tablename USING dual ON (val3 = in_val3)
WHEN MATCHED THEN UPDATE SET val1 = in_val1, val2 = in_val2
WHEN NOT MATCHED THEN INSERT
VALUES (in_val1, in_val2, in_val3)
В первом примере обновление делает индекса поиска. Он должен, чтобы обновить правую строку. Oracle открывает неявный курсор, и мы используем его для обертывания соответствующей вставки, чтобы мы знали, что вставка произойдет только тогда, когда ключ не существует. Но вставка - независимая команда, и она должна выполнить второй поиск. Я не знаю внутренней работы команды слияния, но поскольку команда представляет собой единое целое, Oracle могла бы выполнить правильную вставку или обновление с помощью единого индекса.
Я думаю, что слияние лучше, если у вас есть обработка, которая будет выполняться, что означает получение данных из некоторых таблиц и обновление таблицы, возможно, вставку или удаление строк. Но для случая с одной строкой вы можете рассмотреть первый случай, поскольку синтаксис более распространен.
По-видимому, "сливаются в" statem ent не является атомарным. Это может привести к «ORA-0001: уникальному ограничению» при одновременном использовании. Проверка наличия совпадения и вставка новой записи не защищены блокировкой, поэтому существует условие гонки. Чтобы сделать это надежно, вам нужно поймать это исключение и либо повторно запустить слияние, либо сделать простое обновление. В Oracle 10 вы можете использовать предложение «log errors», чтобы продолжить его с остальными строками при возникновении ошибки и занести в журнал нарушающую строку в другую таблицу, а не просто останавливаться. – 2009-07-13 05:15:15
Привет, я попытался использовать тот же шаблон запроса в моем запросе, но каким-то образом мой запрос вставляет повторяющиеся строки. Я не могу найти больше информации о таблице DUAL. Может кто-нибудь, пожалуйста, скажите мне, где я могу получить информацию о DUAL, а также о синтаксисе слияния? – Shekhar 2010-10-15 06:12:05
@Shekhar Dual - это фиктивная таблица с одним рядом и столбцом http://www.adp-gmbh.ch/ora/misc/dual.html – YogoZuno 2010-11-19 04:56:16