Oracle 9i新增的MERGE語法

為了測試Oracle 9i新增的MERGE語法,建立了兩個測試表格。

歷屆選手表
create table sportsman_history (name  varchar2(30),live_area  varchar2(100)) tablespace users;
insert into sportsman_history values ('張三','台南市') ;
insert into sportsman_history values ('李四','新北市') ;
insert into sportsman_history values ('王五','宜蘭縣') ;
commit;

選手申請表
create table apply_temp (name  varchar2(30),live_area  varchar2(100))tablespace users;
insert into apply_temp values ('張三','嘉義市') ;
insert into apply_temp values ('李四','新北市') ;
insert into apply_temp values ('陳七','屏東縣') ;
commit;


SQL> column name format a20;
SQL> column live_area format a20;
SQL> select * from sportsman_history;

NAME                 LIVE_AREA
-------------------- --------------------
張三                 台南市
李四                 新北市
王五                 宜蘭縣


SQL> select * from apply_temp;

NAME                 LIVE_AREA
-------------------- --------------------
張三                 嘉義市
李四                 新北市
陳七                 屏東縣


判斷「選手申請表」中沒有「歷屆選手表」的姓名,則新增到「歷屆選手表」,否則更新「歷屆選手表」的資料
SQL> MERGE INTO sportsman_history sh USING  apply_temp at
         ON (sh.name=at.name)
         WHEN MATCHED THEN UPDATE SET sh.live_area=at.live_area
         WHEN NOT MATCHED THEN INSERT VALUES (at.name,at.live_area);


SQL> select * from sportsman_history;

NAME                 LIVE_AREA
-------------------- --------------------
陳七                 屏東縣
張三                 嘉義市
李四                 新北市
王五                 宜蘭縣


如果是以PL/SQL來寫,程式應該如下:
declare
    v_check  number;    
     cursor cur_1 is
         select * from apply_temp at ;   
     r1 cur_1%rowtype;    
begin
    for r1 in cur_1 loop
         select count(1) into v_check from sportsman_history sh
            where sh.name=r1.name;
         if v_check >0 then
              update sportsman_history sh set sh.name=r1.name;
          else
              insert into sportsman_history sh values (r1.name,r1.live_area);
          end if;    
     end loop;
end;
   
由上述可知,利用Oracle 9i新增的語法MERGE來完成Insert與update的動作,
只需要對Table進行一次Full Scan就可以完成,執行效率較高。

Oracle DB的listener.log清理