问题收集日期: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;