程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> [Oracle]InsertAll的妙用

[Oracle]InsertAll的妙用

編輯:Oracle教程

無條件的插入

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 all
into 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 first
when object_id = 1 then
into 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$                              1

select * from t2;

OBJECT_NAME                OBJECT_ID
--------------------------------- ---
I_USER1                            2
CON$                               3
UNDO$                              4
C_COBJ#                            5

--insert all
insert all
when object_id = 1 then
into 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$                              1
SQL> select * from t2;

OBJECT_NAME                OBJECT_ID
--------------------------------- ---
ICOL$                              1
I_USER1                            2
CON$                               3
UNDO$                              4
C_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       6000

insert all
into 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_fri
from 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. 多表插入語句中的子查詢不能使用序列。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved