Ответ, который MichaelS дает в упомянутой выше ветке, должен работать нормально. Сообщение об ошибке, которое вы получаете (ORA-38104: столбцы, указанные в пункте ON, не могут быть обновлены: foo.id), предполагает, что вы пытаетесь сделать что-то похожее на следующее:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.id = bar.id, foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Как указано в ошибке, столбцы, указанные в предложении «ON», не могут быть обновлены. Таким образом, следующее будет работать нормально:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Если вам действительно нужно обновить foo.id, здесь есть возможное решение: Как избежать ошибки ORA-3814 при слиянии?
Изменить
Возможной альтернативой было бы сделать следующее:
update foo set row = bar where foo.id = bar.id;
if sql%rowcount = 0 then
insert into foo values bar;
end if;
По сути, это должно приравниваться к выполнению того же действия, что и оператор слияния.
person
Chrisrs2292
schedule
15.12.2015
FORALL MERGE
. Однако решение от MichaelS выглядит многообещающе. - person Anders   schedule 17.11.2015ORA-38104: Columns referenced in the ON Clause cannot be updated: foo.id
- person Anders   schedule 17.11.2015bar
- это переменная типаfoo%ROWTYPE
.foo
— это таблица. - person Anders   schedule 02.12.2015