ORACLE MERGER 的应有和问题
问题收集日期:2007-10-12
测试用例
create table A1
(
A VARCHAR2(20),
B NUMBER(20,2)
);
create table A2
(
A VARCHAR2(20),
B NUMBER(20,2),
C NUMBER(20,2)
);
insert into A1 (A, B)
values ('a', 12);
insert into A1 (A, B)
values ('v', 121);
insert into A1 (A, B)
values ('d', 22);
说明:以A1来处理A2。
------没有子查询的变量的应用
declare
v1 varchar2(20);
v2 varchar2(20);
v3 number(20,2);
v4 number(20,2);
begin
v1:='a';
v2:='v';
v3:=1090;
v4:=8888;
merge into a2
using a1 tt
on (a2.a=tt.a )
when matched then
update set c=v3
when not matched then
insert (a,b,c)
values(tt.a,tt.b,v4);
end;
-------子查询的情况 变量的应用
declare
v1 varchar2(20);
v2 varchar2(20);
v3 number(20,2);
v4 number(20,2);
begin
v1:='a';
v2:='v';
v3:=1090;
v4:=8888;
merge into a2
using (select a,b,v4 as c,v3 as d from a1 where a1.a= v1 or a1.a=v2) tt
on (a2.a=tt.a )
when matched then
update set c=tt.d
when not matched then
insert (a,b,c)
values(tt.a,tt.b,tt.c);
end;
为什么以下这么用不可以呢?
declare
v1 varchar2(20);
v2 varchar2(20);
v3 number(20,2);
v4 number(20,2);
begin
v1:='a';
v2:='v';
v3:=1090;
v4:=8888;
merge into a2
using (select a,b, from a1 where a1.a= v1 or a1.a=v2) tt
on (a2.a=tt.a )
when matched then
update set c=v3
when not matched then
insert (a,b,c)
values(tt.a,tt.b,v4);
end;