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生成下一个数字,并且语句中的所有后续引用返回相同的数字。

·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_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;">

 
 
 
 

ORACLE INSERT ALL 用法的更多相关文章

  1. Oracle insert all用法简介

    insert all是oracle中用于批量写数据的 现在直接通过例子学习一下,比较简单直观,例子来自<收获,不止SQL优化>一书 环境准备 create table t as selec ...

  2. Oracle笔记-Multitable INSERT 的用法

    [转自]  http://blog.chinaunix.net/uid-8504518-id-3310531.html 为避免日趋衰退的记忆力,参考官方E文文档<Introduction to ...

  3. [转]ORACLE的ProC用法讲解

    pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp  parse=none iname=filename.pc oname=filename.cp ...

  4. 【转】关于oracle with as用法

    原文链接:关于oracle with as用法 with as语法–针对一个别名with tmp as (select * from tb_name) –针对多个别名with   tmp as (se ...

  5. ORACLE 中ROWNUM用法总结(转)

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  6. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  7. Oracle CASE WHEN 用法介绍[Z]

    Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...

  8. 转:ORACLE 中ROWNUM用法总结!

    oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...

  9. oracle expdp/impdp 用法详解

    http://hi.baidu.com/hzfsai/item/4a4b3fc4b1cf7e51ad00efbd oracle expdp/impdp 用法详解 Data Pump 反映了整个导出/导 ...

随机推荐

  1. [GO]errorr接口的使用

    package main import ( "fmt" "errors" ) func main() { erro1 := fmt.Errorf("% ...

  2. Spring框架总结(四)

    对象依赖关系 Spring中,如何给对象的属性赋值?  [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4)自动装配(了解) 5) 注解 一.对象属性赋值 ...

  3. ES6语法的新特性

    ES6 就是ECMAScript 6是新版本JavaScript语言的标准.虽然目前已经更新到ES7,但是很多浏览器还不知处ES7语法,该标准仍在更新中,但目前部门网站都指出ES6的语法.目前ES6也 ...

  4. 关于Javascript 那些事

    Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为 ...

  5. Alpha冲刺(六)

    Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 - 过去两天完成了哪些任务 1. 基于ssm框架的前后端交互 ...

  6. SIP协议整理

    本文记录开发.实现IMS项目时,整理的SIP协议基础知识:若有侵权,请告之. SIP协议 1.      SIP协议简介 SIP是一个应用层的控制协议,可以用来建立.修改.和终止多媒体会话(或者会议) ...

  7. vs项目属性中的包含目录和库目录以及附加依赖项全都配置正确了,却还是提示:无法解析的外部符号

    这种情况下,很大可能是lib文件有问题 我是用vs编译下载的源代码文件得到的lib出现了如题的情况, 后来去网站上直接下载了lib文件,竟然解决了!-.-

  8. replaceState 实现返回从新定位

    在web 开发中,选择列表分类,在中商品, 详情页面后,返回的时候我们想定位到原来选择的分类 就需要借助window.history.replaceState来实现 function getProdu ...

  9. 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?

    虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...

  10. idea新建maven项目没有src目录

    方法一:设置idear的maven运行参数 或: 加:archetypeCatalog=internal 如果ctrl+alt+s进设置,只能对当前项目新建Module其作用: 方法二:在新建mave ...