Как динамически использовать исходную / целевую таблицу для слияния, а также динамически выбирать столбцы для оператора обновления в Oracle - PullRequest
0 голосов
/ 10 июля 2019

Столкнувшись с проблемой динамического использования таблиц и столбцов для слияния и обновления

Заранее спасибо

Ниже приведен код, который использует статические значения для имен таблиц и имен столбцов

declare vsql varchar2(32767) ;
begin vsql := 
' 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 ( ' ||
' tbl.pk, ' ||
' tbl.data ' ||
' ) values ( ' ||
' qry.pk, ' ||
' qry.data ' ||
' ) ' ;
execute immediate vsql using 1 ; 
end ;

1 Ответ

1 голос
/ 11 июля 2019

Измените свой код на:

' 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;
...