ORACLE INSERT ALL 用法


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條件中的每個表達式都必須引用子查詢的選擇列表返回的列。單個多表插入語句最多可包含127WHEN子句。

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生成下一個數字,並且語句中的所有后續引用返回相同的數字。

·https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/INSERT.html#GUID-903F8043-0254-4EE9-ACC1-CB8AC0AF3423

 

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_IDOBJECT_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;">






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM