【转载】多表插入INSERT ALL…

来源:互联网 发布:三维模型查看软件 编辑:程序博客网 时间:2024/06/05 19:18

在数据仓库中的转换和装载过程中,可能会使用INSERT ALL语句,这篇文章简单介绍一下INSERTALL语句。但在ETL工具中很多组件也有类似的功能,实现逻辑雷同。

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

1、不带条件的INSERT ALL用法:

SQL> CREATE TABLE TABLE_STORAGE
  (
  TABLE_NAMEVARCHAR2(30),
  TABLESPACE_NAMEVARCHAR2(30),
  PCT_FREE NUMBER,
  PCT_USED NUMBER,
  INI_TRANS NUMBER,
  MAX_TRANS NUMBER,
  INITIAL_EXTENTNUMBER,
 10  NEXT_EXTENTNUMBER,
 11  MIN_EXTENTSNUMBER,
 12  MAX_EXTENTSNUMBER,
 13  PCT_INCREASENUMBER,
 14  FREELISTS NUMBER,
 15  FREELIST_GROUPSNUMBER
 16  );

表已创建。

SQL> CREATE TABLE TABLE_STAT
  (
  TABLE_NAMEVARCHAR2(30),
  NUM_ROWS NUMBER,
  BLOCKS NUMBER,
  EMPTY_BLOCKSNUMBER,
  AVG_SPACE NUMBER,
  CHAIN_CNT NUMBER,
  AVG_ROW_LEN NUMBER
 10  );

表已创建。

SQL> INSERTALL
  INTO TABLE_STORAGE VALUES (TABLE_NAME,TABLESPACE_NAME, PCT_FREE, PCT_USED,
  INI_TRANS, MAX_TRANS,INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,PCT_INCREASE,FREELISTS, FREELIST_GROUPS)
  INTO TABLE_STAT VALUES (TABLE_NAME,NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE,CHAIN_CNT,AVG_ROW_LEN)
  SELECT * FROMUSER_TABLES;

 

已创建54行。

SQL> SELECT COUNT(*) FROM TABLE_STORAGE;

  COUNT(*)
----------
       12

SQL> SELECT COUNT(*) FROM TABLE_STAT;

  COUNT(*)
----------
       12

SQL> SELECT COUNT(*) FROM USER_TABLES;

  COUNT(*)
----------
       12

SQL> DROP TABLE TABLE_STAT;

表已丢弃。

SQL> DROP TABLE TABLE_STORAGE;

表已丢弃。


2、带条件的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> INSERTALL 
  WHEN (object_type= 'TABLE') THENINTO table_all VALUES (object_name) 
  WHEN (object_type= 'INDEX') THENINTO index_all VALUES (object_name) 
  ELSEINTO object_other (OBJECT_NAME,OBJECT_TYPE)
  SELECT object_name,object_type FROM user_objects;

已创建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
  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;

表已丢弃。


3、INSERT ALL和INSERT FIRST的区别:

 


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

表已创建。

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

表已创建。

SQL> INSERTALL 
  WHEN (segment_type= 'TABLE') THENINTO table_all VALUES (segment_name, segment_type)
  WHEN (tablespace_name= 'USERS') THENINTO tablespace_users VALUES (segment_name,segment_type)
  SELECT segment_name,segment_type, tablespace_name 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> INSERTFIRST 
  WHEN (segment_type= 'TABLE') THENINTO table_all VALUES (segment_name, segment_type)
  WHEN (tablespace_name= 'USERS') THENINTO tablespace_users VALUES (segment_name,segment_type)
  SELECT segment_name,segment_type, tablespace_name 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

        

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

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

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

3、不能使用表集合表达式;

4、不能超过999个目标列;

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

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

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

原创粉丝点击