INSERT ALL和INSERT FIRST语法

转自:http://yangtingkun.itpub.net/post/468/27038

 

INSERT ALL和INSERT FIRST语法
===========================================================

在数据仓库中的转换和装载过程中,可能会使用INSERT ALL语句,这篇文章简单介绍一下INSERT ALL语句。

 

 

 

 

INSERT ALL是9i新增的语法,它扩充了原有的INSERT语句,使得INSERT语句从原来的只能插入到一张表发展到可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表中。

 

下面看几个简单的例子:

 

SQL> CREATE TABLE TABLE_STORAGE
  2  (
  3  TABLE_NAME VARCHAR2(30),
  4  TABLESPACE_NAME VARCHAR2(30),
  5  PCT_FREE NUMBER,
  6  PCT_USED NUMBER,
  7  INI_TRANS NUMBER,
  8  MAX_TRANS NUMBER,
  9  INITIAL_EXTENT NUMBER,
 10  NEXT_EXTENT NUMBER,
 11  MIN_EXTENTS NUMBER,
 12  MAX_EXTENTS NUMBER,
 13  PCT_INCREASE NUMBER,
 14  FREELISTS NUMBER,
 15  FREELIST_GROUPS NUMBER
 16  );

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE TABLE_STAT
  2  (
  3  TABLE_NAME VARCHAR2(30),
  4  NUM_ROWS NUMBER,
  5  BLOCKS NUMBER,
  6  EMPTY_BLOCKS NUMBER,
  7  AVG_SPACE NUMBER,
  8  CHAIN_CNT NUMBER,
  9  AVG_ROW_LEN NUMBER
 10  );

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  INTO TABLE_STORAGE VALUES (TABLE_NAME, TABLESPACE_NAME, PCT_FREE, PCT_USED,
  3  INI_TRANS, MAX_TRANS, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,
  4  PCT_INCREASE, FREELISTS, FREELIST_GROUPS)
  5  INTO TABLE_STAT VALUES (TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE,
  6  CHAIN_CNT, AVG_ROW_LEN)
  7  SELECT * FROM USER_TABLES;

 

 

 

已创建

54行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_STORAGE;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM TABLE_STAT;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM USER_TABLES;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> DROP TABLE TABLE_STAT;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE TABLE_STORAGE;

 

 

 

表已丢弃。

 

 

 

上面是最简单的INSERT ALL语句的实现,下面看看带条件的INSERT ALL语句。

 

SQL> CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE INDEX_ALL (INDEX_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE OBJECT_OTHER (OBJECT_NAME VARCHAR2(30), OBJECT_TYPE VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  WHEN (OBJECT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (OBJECT_NAME)
  4  WHEN (OBJECT_TYPE = 'INDEX') THEN
  5  INTO INDEX_ALL VALUES (OBJECT_NAME)
  6  ELSE
  7  INTO OBJECT_OTHER
  8  SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS
  9  ;

 

 

 

已创建

91行。

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX';

 

 

 

  COUNT(*)
----------
        14

 

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS
  2  WHERE OBJECT_TYPE NOT IN ('TABLE', 'INDEX');

 

 

 

  COUNT(*)
----------
        50

 

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM INDEX_ALL;

 

 

 

  COUNT(*)
----------
        14

 

 

 

SQL> SELECT COUNT(*) FROM OBJECT_OTHER;

 

 

 

  COUNT(*)
----------
        50

 

 

 

SQL> DROP TABLE TABLE_ALL;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE INDEX_ALL;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE OBJECT_OTHER;

 

 

 

表已丢弃。

 

 

 

下面看一下INSERT ALL和INSERT FIRST的区别:

 

SQL> CREATE TABLE TABLESPACE_USERS (NAME VARCHAR2(30), TYPE VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  WHEN (SEGMENT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (SEGMENT_NAME)
  4  WHEN (TABLESPACE_NAME = 'USERS') THEN
  5  INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)
  6  SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME
  7  FROM USER_SEGMENTS;

 

 

 

已创建

69行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        21

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS;

 

 

 

  COUNT(*)
----------
        48

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
        18

 

 

 

SQL> TRUNCATE TABLE TABLE_ALL;

 

 

 

表已截掉。

 

 

 

SQL> TRUNCATE TABLE TABLESPACE_USERS;

 

 

 

表已截掉。

 

 

 

SQL> INSERT FIRST
  2  WHEN (SEGMENT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (SEGMENT_NAME)
  4  WHEN (TABLESPACE_NAME = 'USERS') THEN
  5  INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)
  6  SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME
  7  FROM USER_SEGMENTS;

 

 

 

已创建

51行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        21

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS;

 

 

 

  COUNT(*)
----------
        30

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
         0

 

 

 

最后看一下多表插入语句的限制条件:

 

只能对表执行多表插入语句,不能对视图或物化视图执行;

 

不能对远端表执行多表插入语句;

 

不能使用表集合表达式;

 

不能超过999个目标列;

 

RAC环境中或目标表是索引组织表或目标表上建有BITMAP索引时,多表插入语句不能并行执行;

 

多表插入语句不支持执行计划稳定性;

 

多表插入语句中的子查询不能使用序列。

 

 

INSERT ALL和INSERT FIRST语句的差别:

其实你对比INSERT ALL和INSERT FIRST语句的例子仔细观察,就会明白这个例子的含义,两个SQL语句唯一的差别就是ALL和FIRST的差别,其余部分完成一样。
对于INSERT ALL,插入第一张表的数据,如果满足第二张表的条件,也会插入。
而INSERT FIRST不然,满足第一条插入条件的数据是不会进行随后的判断的,所以在INSERT FIRST执行后,在TABLESPACE_USERS表中看不到SEGMENT_TYPE为TABLE的记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值