[Oracle] Insert All的妙用

來源:互聯網
上載者:User

無條件的插入

Oracle中的insert all是指把同一批資料插入到不同的表中,假如現在有個需求:把t表中的資料分別插入t1,t2,如果你不知道insert all,你可能會使用insert插入2次,如下所示:

insert  into t1(object_name,object_id) select * from t;insert  into t2(object_name,object_id) select * from t;commit;
事實上,以上這種寫法是錯誤的,因為在兩次insert的過程中,t表的資料有可能已經發生了變化,也就是說,t1,t2表得到的資料有可能不一樣,正確的寫法應該是採用insert all:

insert allinto t1(object_name,object_id)into t2(object_name,object_id)select * from t;commit;


有條件的插入insert first/all 是對每一行來進行判斷
兩者區別:
insert first:對於每一行資料,只插入到第一個when條件成立的表,不繼續檢查其他條件。
insert all : 對於每一行資料,對每一個when條件都進行檢查,如果滿足條件就執行插入操作。 
看下面的例子:

--insert first--前面等於1的條件被<=5含在內,FIRST就表示前面插入了,後面不會再插入了。insert firstwhen object_id = 1 theninto t1(object_name,object_id)when object_id <=5 then                      into t2(object_name,object_id)select * from t;commit;select * from t1;OBJECT_NAME                OBJECT_ID--------------------------------- ---ICOL$                              1select * from t2;OBJECT_NAME                OBJECT_ID--------------------------------- ---I_USER1                            2CON$                               3UNDO$                              4C_COBJ#                            5--insert allinsert allwhen object_id = 1 theninto t1(object_name,object_id)when object_id <=5 then                      into t2(object_name,object_id)select * from t;commit;SQL> select * from t1;OBJECT_NAME                OBJECT_ID--------------------------------- ---ICOL$                              1SQL> select * from t2;OBJECT_NAME                OBJECT_ID--------------------------------- ---ICOL$                              1I_USER1                            2CON$                               3UNDO$                              4C_COBJ#                            5

行轉列插入insert all還可以實現行轉列插入:
select * from sales_source_data;EMPLOYEE_ID    WEEK_ID  SALES_MON  SALES_TUE  SALES_WED SALES_THUR  SALES_FRI----------- ---------- ---------- ---------- ---------- ---------- ----------        176          6       2000       3000       4000       5000       6000insert allinto sales_info values(employee_id,week_id,sales_mon)into sales_info values(employee_id,week_id,sales_tue)into sales_info values(employee_id,week_id,sales_wed)into sales_info values(employee_id,week_id,sales_thur)into sales_info values(employee_id,week_id,sales_fri)select employee_id,week_id,sales_mon,sales_tue,sales_wed,sales_thur,sales_frifrom sales_source_data;select * from sales_info;EMPLOYEE_ID       WEEK      SALES----------- ---------- ----------        176          6       2000        176          6       3000        176          6       4000        176          6       5000        176          6       6000

多表插入語句的限制條件 1. 只能對錶執行多表插入語句,不能對視圖或物化視圖執行;
 2. 不能對遠端表執行多表插入語句;
 3. 不能使用表集合運算式;
 4. 不能超過999個目標列;
 5. 在RAC環境中或目標表是索引組織表或目標表上建有BITMAP索引時,多表插入語句不能並存執行;
 6. 多表插入語句不支援執行計畫穩定性;
 7. 多表插入語句中的子查詢不能使用序列。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.