insert高階語法

tangguowuvv發表於2018-02-22
有這樣一個業務需求,要求根據不同條件將源資料插入到不同的表中,源資料表更新十分頻繁,這樣的一個業務需求應該怎麼做呢?我先給出源表結構和需要插入的表結構:
更新十分頻繁的源表:
create table people(id number,name varchar2(20),sex char(3),address varchar2(500));
給源表插入資料:
insert into people 
values(1,'張翠山','男','武當山');
insert into people 
values(2,'殷素素','女','天鷹教');
insert into people 
values(3,'張無忌','男','明教');
insert into people 
values(4,'趙敏','女','皇室');
insert into people 
values(5,'周芷若','女','峨眉山');
insert into people 
values(6,'成昆','男','少林寺');
commit;
查詢一下people結果,如圖所示:
insert高階語法

待插入的幾張表結構:
create table people_1(id number,name varchar2(20));
create table people_2(id number,sex char(3));
create table people_3(sex char(3),address varchar2(500));
現在的業務需求是,將ID<=4的記錄插入到people_1中,SEX='男'的插入到people_2,剩下的插入到people_3中。乍一看,此需求可以這樣做insert into people_1 select id,name from people where id<=4; insert into people_2 select id,sex from people where SEX='男'insert into people_3 select sex,sddress from people where id>4 and SEX!='男';但是people是一個頻繁DML的表,如果分成這樣子三步執行,在資料量特別大的情況下,每步插入操作會消耗較長時間,在這一段時間之內,又會有大批次資料改變,導致三步操作的表資料基數都不一樣,結果當然會有偏差。因此,在這裡我們用到了insert的高階語法。
SQL如下:
insert all
when id<=4 then into people_1 values(id,name)
  when sex='男' then into people_2 values(id,sex)
    else into people_3 values(sex,address)
select * from people;
結果如下:
PEOPLE_1:                   PEOPLE_2:         PEOPLE_3:
insert高階語法       insert高階語法    insert高階語法

如果我只想ID=1在people_1中插入之後就不在people_2中插入,那麼可以使用insert first,它會從前到後進行判斷,如果一條記錄在前面已經插入,則在之後略過此條記錄。
SQL如下:
insert first
when id<=4 then into people_1 values(id,name)
  when sex='男' then into people_2 values(id,sex)
    else into people_3 values(sex,address)
select * from people;
結果如下:
PEOPLE_1:                   PEOPLE_2:         PEOPLE_3:
insert高階語法   insert高階語法       insert高階語法

當然,這個是根據條件插入的,當沒有條件的時候,可以直接進行插入。
SQL如下:
insert all/first
into people_1 values(id,name)
into people_2 values(id,sex)
into people_3 values(sex,address)
select * from people;
其實很多時候,現實業務的要求oracle都為我們考慮到了,而且其效能通常強於我們自己寫的PL/SQL,更多的精彩業務實現,還等著我們去探索。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30485601/viewspace-2151152/,如需轉載,請註明出處,否則將追究法律責任。

相關文章