动态使用表和列进行合并和更新时遇到的问题
预先感谢
下面是将静态值用于表名和列名的代码
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 ;
答案 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.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;