1INSERT ALL
1.1句法
multi_table_insert :: =
conditional_insert_clause :: =
1.2multi_table_insert
在多表插入中,將從子查詢求值返回的行派生的計算行插入到一個或多個表中。
表別名不是由子查詢的選擇列表定義的。因此,它們在依賴於選擇列表的子句中不可見。例如,嘗試引用表達式中的對象列時可能會發生這種情況。要使用帶有表別名的表達式,必須將表達式放入帶有列別名的選擇列表中,然后引用多表插入的VALUES子句或WHEN條件中的列別名。
ALL into_clause
指定ALL后跟多個insert_into_clauses以執行無條件多表插入。Oracle數據庫對子insert_into_clause查詢返回的每一行執行一次。
1.3conditional_insert_clause
指定conditional_insert_clause執行條件多表插入。Oracle數據庫insert_into_clause通過相應的WHEN條件過濾每個條件,這決定了是否insert_into_clause執行了該條件。WHEN條件中的每個表達式都必須引用子查詢的選擇列表返回的列。單個多表插入語句最多可包含127個WHEN子句。
ALL
如果指定ALL默認值,則數據庫將評估每個WHEN子句,而不管任何其他WHEN子句的評估結果如何。對於WHEN條件求值為true的每個子句,數據庫執行相應的INTO子句列表。
FIRST
如果指定FIRST,則數據庫WHEN按照它在語句中出現的順序計算每個子句。對於WHEN計算結果為true 的第一個子句,數據庫將執行相應的INTO子句並跳過WHEN給定行的后續子句。
ELSE 說明
對於給定的行,如果沒有WHEN子句的計算結果為true,則:
- 如果已指定ELSE子句,則數據庫將執行與INTO子句關聯的子句列表ELSE。
- 如果未指定else子句,則數據庫不對該行執行任何操作。
1.4多表插入的限制
多表插入符合以下限制:
- 您只能在表上執行多表插入,而不能在視圖或物化視圖上執行。
- 您無法在遠程表中執行多表插入。
- TABLE執行多表插入時,無法指定集合表達式。
- 如果任何目標表是索引組織的,或者任何目標表上定義了位圖索引,則不會並行化多表插入。
- 多表插入語句不支持計划穩定性。
- 您不能在多表插入語句的任何部分中指定序列。多表插入被視為單個SQL語句。因此,第一個引用NEXTVAL生成下一個數字,並且語句中的所有后續引用返回相同的數字。
1.5多表插入:示例
1.5.1INSERT ALL 無條件
以下示例使用多表格插入語法將sh.sales
來自具有不同結構的輸入表的一些數據插入到示例表中。
SELECT * FROM sales_input_table;
PRODUCT_ID CUSTOMER_ID WEEKLY_ST SALES_SUN SALES_MON SALES_TUE SALES_WED SALES_THU SALES_FRI SALES_SAT
---------- ----------- --------- ---------- ---------- ---------- ----
111 222 01-OCT-00 100 200 300 400 500 600 700
222 333 08-OCT-00 200 300 400 500 600 700 800
333 444 15-OCT-00 300 400 500 600 700 800 900
INSERT ALL
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date, sales_sun)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+3, sales_wed)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+4, sales_thu)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+5, sales_fri)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+6, sales_sat)
SELECT product_id, customer_id, weekly_start_date, sales_sun,
sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
FROM sales_input_table;
SELECT * FROM sales
ORDER BY prod_id, cust_id, time_id;
PROD_ID CUST_ID TIME_ID CPROMO_ID QUANTITY_SOLD AMOUNT COST
---------- ---------- --------- - ---------- ------------- ---------- ----------
111 222 01-OCT-00 100
111 222 02-OCT-00 200
111 222 03-OCT-00 300
111 222 04-OCT-00 400
111 222 05-OCT-00 500
111 222 06-OCT-00 600
111 222 07-OCT-00 700
222 333 08-OCT-00 200
222 333 09-OCT-00 300
222 333 10-OCT-00 400
222 333 11-OCT-00 500
222 333 12-OCT-00 600
222 333 13-OCT-00 700
222 333 14-OCT-00 800
333 444 15-OCT-00 300
333444 16-OCT-00 400
333 444 17-OCT-00 500
333 444 18-OCT-00 600
333 444 19-OCT-00 700
333 444 20-OCT-00 800
333 444 21-OCT-00 900
1.5.2INSERT ALL 帶條件
環境建立:
Create table T_TAR1 (ID NUMBER ,NAME VARCHAR2(30), TYPE VARCHAR2(19));
Create table T_TAR2 (ID NUMBER ,NAME VARCHAR2(30), TYPE VARCHAR2(19));
目標:從DBA_OBJECTS 對象獲取OBJECT_ID,OBJECT_NAME 和OBJECT_TYPE插入到T_TAR1表並且將DBA_OBJECTS對象中TYPE類型為TABLE 或VIEW的插入到T_TAR2表
Set timing on
Set linesize 160
alter system flush buffer_cache;
alter system flush shared_pool;
truncate table T_TAR1;
truncate table T_TAR2;
SYS@test> INSERT ALL
WHEN 1=1 THEN
INTO T_TAR1
WHEN OBJECT_TYPE='TABLE' or OBJECT_TYPE='VIEW'THEN
INTO T_TAR2
select OBJECT_ID,OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS;
82538 rows created.
Commit complete.
Elapsed: 00:00:00.71
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">