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





  • 相关阅读:
    iptables 常用命令解析
    iptables 常用处理动作
    centos7 中iptables、firewalld 和 netfilter 的关系
    iptables 的几个状态
    centos7 中没有service iptables save指令来保存防火墙规则
    iptables 数据走向流程
    数据库PDO简介
    php连接mySql,加密函数
    php数组,常量,遍历等
    php的会话控制
  • 原文地址:https://www.cnblogs.com/cqdba/p/85e5d1b3bc40ed3aa977fdecf44c9111.html
Copyright © 2020-2023  润新知