Измените свой код на:
' merge into ' ||
' EDW tbl ' ||
' using ( ' ||
' select ' ||
' STG.pk, ' ||
' STG.data ' ||
' from ' ||
' STG ' ||
' where ' ||
' STG.pk = :1 ' ||
' ) qry ' ||
' on ( ' ||
' tbl.pk = qry.pk ' ||
' ) ' ||
' when matched then ' ||
' update ' ||
' set ' ||
' tbl.data = qry.data ' ||
' when not matched then ' ||
' insert ( ' ||
' pk, ' ||
' data ' ||
' ) values ( ' ||
' qry.pk, ' ||
' qry.data ' ||
' ) ' ;
tbl.pk
и tbl.data
укажите значения полей, а не имя поля.
Также,Я не понимаю, почему вы строите этот оператор как строку и используете EXECUTE IMMEDIATE - он будет работать просто так:
DECLARE
nVar NUMBER := 1;
BEGIN
merge into EDW tbl
using (select STG.pk,
STG.data
from STG
where STG.pk = nVar) qry
on (tbl.pk = qry.pk)
when matched then
update set tbl.data = qry.data
when not matched then
insert (pk, data)
values (qry.pk, qry.data);
END;