如何动态使用源/目标表进行合并,以及如何动态选择Oracle中用于update语句的列

时间:2019-07-10 19:42:49

标签: oracle shell scripting plsqldeveloper

动态使用表和列进行合并和更新时遇到的问题

预先感谢

下面是将静态值用于表名和列名的代码

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 个答案:

答案 0 :(得分:1)

将代码更改为:

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