在業務處理過程中經常會碰到將業務數據按照條件分別插入不同的數據表的問題按照傳統的處理方式需要分條件執行多次檢索後分別插入不同的表單這樣因為執行了重復的檢索造成cpu和內存的浪費從oraclei開始引入了insert all關鍵字支持將某張表的數據同時插入多張表單語法如下
Insert all Insert_into_clause [value_clause] subquery;
Insert conditional_insert_clause subquery;
如上所示insert_into_clause用於指定insert子句value clause用於指定值子句subquery用於指定提供數據的子查詢condition_insert_clause用於指定insert條件子句
當使用all操作符執行多表插入時在每個條件子句上都要執行into子句後的子查詢並且條件中使用的列必須在插入和子查詢的結果集中
創建測試用表
createtable tdate(
idvarchar()
namevarchar()
birthday datedefaultsysdate
);
插入數據
insertinto tdate values(zhangsanto_date(YYYYMMDD));
insertinto tdate values(zhangsanto_date(YYYYMMDD));
insertinto tdate values(lisito_date(YYYYMMDD));
insertinto tdate values(wangwudefault);
insertinto tdate(idname) values(zhangsan);
commit;
創建接收用測試表
createtable tdate asselect * from tdate where=;
createtable tdate asselect * from tdate where=;
commit;
使用all關鍵字執行多表插入操作
insertall
when birthday > 月theninto tdate
when birthday < 月theninto tdate
whenname = zhangsantheninto tdate
whenname = lisitheninto tdate
select * from tdate;
在上述操作語句中如果原表tdate中存在既滿足birthday > 月又滿足name = zhangsan的數據那麼將執行兩次插入而使用first關鍵字就可以避免這個問題使用first關鍵字時如果有記錄已經滿足先前條件並且已經被插入到某個表單中(未必非要是同一個表)那麼該行數據在後續插入中將不會被再次使用也就是說使用first關鍵字原表每行數據按照執行順序只會被插入一次
insertfirst
when birthday > 月theninto tdate
when birthday < 月theninto tdate
whenname = zhangsantheninto tdate
whenname = lisitheninto tdate
select * from tdate;
From:http://tw.wingwit.com/Article/program/Oracle/201311/18168.html