為了測試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就可以完成,執行效率較高。
歷屆選手表
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就可以完成,執行效率較高。