Когда я запускал ваш код, он выдавал эту ошибку:
ORA-01747: недопустимая спецификация user.table.column, table.column или столбца
Thisпотому что вы ошибочно заключили предложение SET в скобки.Вы должны удалить их.
Сделав так, чтобы код швырнул:
ORA-38101: Неверный столбец в предложении INSERT VALUES: "D". "ID"
Это связано с тем, что исходные и целевые таблицы имеют одинаковую проекцию, поэтому имена столбцов в операторе INSERT определены неоднозначно.Вы можете утверждать, что компилятор должен знать, что столбцы в проекции INSERT () относятся к tableA
, а столбцы в проекции VALUES () относятся к tableb
.Как бы то ни было, мы должны подчиняться компилятору.Поэтому вам нужно указать имена столбцов.
Эта версия вашего кода работает:
merge into TableA d
using TableB s
on (trim(d.stable) = trim(s.stable)
and trim(d.a) = trim(s.a)
and trim(d.l) = trim(s.l))
when MATCHED then
update
-- remove unnecessary brackets
set d.n = trim(s.n)
,d.usr= s.usr
,d.dt= s.dt
when NOT MATCHED then
-- alias all the columns
insert (d.ID,d.stable,d.a,d.l,d.n,d.usr,d.dt,d.Ouser,d.Odate)
values (s.ID,s.stable,s.a,s.l,s.n,s.usr,s.dt,s.Ouser,s.Odate);