Есть, по крайней мере, два варианта, о которых я могу подумать, кроме как копаться в политике безопасности, о которых я не знаю много.
Обрабатывать записи для слияния строка за строкой.Попытайтесь выполнить обновление, если оно не обновляется, затем вставьте или наоборот, в зависимости от того, ожидаете ли вы, что большинство записей нуждаются в обновлении или вставке (т. Е. Оптимизируйте для наиболее распространенного случая, который уменьшит количество запущенных операторов SQL), например,:
begin
for row in (select ... from source_table) loop
update table_to_be_merged
if sql%rowcount = 0 then -- no row matched, so need to insert
insert ...
end if;
end loop;
end;
Другой вариант может заключаться в групповом сборе записей, которые вы хотите объединить в массив, а затем попытаться массово вставить их, перехватывая все исключения первичного ключа (я не могу вспомнить синтаксис этого правасейчас, но вы можете получить массовую вставку, чтобы поместить все строки, которые не удалось вставить, в другой массив, а затем обработать их).
Логически оператор слияния должен в любом случае проверять наличие каждой записи за кулисами.и я думаю, что он обрабатывается аналогично коду, который я разместил выше.Тем не менее, слияние всегда будет более эффективным, чем его кодирование в PLSQL, поскольку это будет всего один вызов SQL вместо многих.