一 嵌套表概述

       嵌套表是集合类型的一种。嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。默认情况下,每个嵌套表列都产生一个额外的RAW(16)隐藏列,并在其上创建了唯一约束,用以指向嵌套表。而嵌套表中有两个隐藏列:SYS_NC_ROWINFO$是作为一个对象返回所有标量元素的一个伪列;另一个NESTED_TABLE_ID的外键回指向父表。
       存储在一个数据库中的嵌套表并不与表中的其他数据存放在同一个数据块中,它们实际上被存放在第二个表中。正如没有order by字句select语句不能保证返回任何有顺序的数据,从数据库中取回的嵌套表也不能保证元素的顺序。由于集合数据是离线存储的,对于大型集合嵌套表是 一个不错的选择。

二  嵌套表的语法:
   
       嵌套表的定义语法:TYPE type_name IS TABLE OF element_type [NOT NULL];

三 嵌套表的特性:

  •        嵌套表集合中的元素没有数量限制
  •        嵌套表的存储不与表中其他数据存放在同一个数据块中,存放在第二个表中。
  •        嵌套表集合离线存储
四 嵌套表实例
1)创建嵌套表类型

       create type scott.t_tab2_emp as table of varchar2(50);
       创建嵌套表类型在oracle日志表现为:50  create type t_tab2_emp as table of varchar2(50);;

2)创建嵌套表

       create table scott.test_coll_nested(departement number, employees   t_tab2_emp);
---创建嵌套表的时候要为嵌套表类型另外创建一个表来保存数据, NESTED 以下的部分就是在干这事。那个表的名称为:        next_table_name,当前实例的那个表的名称为test_table_emp。
       创建嵌套表在oracle日志表现为:没有日志

3)获取表信息

       desc scott.test_coll_nested;
        Name                       Null?    Type
        ----------------------------------------- -------- ----------------------------
        DEPARTEMENT                        NUMBER
        EMPLOYEES                        SCOTT.T_TAB2_EMP
       也可以直接通过数据字典来获得嵌套表的信息
       select * from all_nested_tables where  owner='SCOTT' and table_name='test_table_emp' AND PARENT_TABLE_NAME='TEST_COLL_NESTED';

4)填充嵌套表数据

       insert into scott.test_coll_nested values(1,scott.t_tab2_emp ('hello','world'));
       填充嵌套表数据在oracle日志表现为:
              71  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('hello');
              71  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('world');
              68  insert into "SCOTT"."TEST_COLL_NESTED"("DEPARTEMENT") values ('1');
       insert into scott.test_coll_nested values(2,scott.t_tab2_emp('123','456','789','101','120','114','45'));
       填充嵌套表数据在oracle日志表现为:
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('123');
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('456');
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('789');
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('101');
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('120');
              69  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('114');
              68  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('45');
              68  insert into "SCOTT"."TEST_COLL_NESTED"("DEPARTEMENT") values ('2');

5)更改嵌套表数据

        update  scott.test_coll_nested set employees=scott.t_tab2_emp('welcome','to','china') where DEPARTEMENT=1;
       更改嵌套表数据在oracle日志表现为:
              99  update "SCOTT"."TEST_COLL_NESTED" set  where "DEPARTEMENT" = '1' and ROWID = 'AABroBAAJAAAlSIAAA';
              73  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('welcome');
              68  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('to');
              71  insert into "SCOTT"."TEST_TABLE_EMP"("COLUMN_VALUE") values ('china');
              102 delete from "SCOTT"."TEST_TABLE_EMP" where "COLUMN_VALUE" = 'hello' and ROWID = 'AABroCAAJAAAlSAAAA';
              102 delete from "SCOTT"."TEST_TABLE_EMP" where "COLUMN_VALUE" = 'world' and ROWID = 'AABroCAAJAAAlSAAAB';

6)删除嵌套表数据

       delete from scott.test_coll_nested where DEPARTEMENT=1;
       删除嵌套表数据在oracle日志表现为:
              99  delete from "SCOTT"."TEST_COLL_NESTED" where "DEPARTEMENT" = '1' and ROWID = 'AABroBAAJAAAlSIAAA';
              104 delete from "SCOTT"."TEST_TABLE_EMP" where "COLUMN_VALUE" = 'welcome' and ROWID = 'AABroCAAJAAAlSAAAJ';
              99  delete from "SCOTT"."TEST_TABLE_EMP" where "COLUMN_VALUE" = 'to' and ROWID = 'AABroCAAJAAAlSAAAK';
              102 delete from "SCOTT"."TEST_TABLE_EMP" where "COLUMN_VALUE" = 'china' and ROWID = 'AABroCAAJAAAlSAAAL';

7)检索嵌套表数据

        select * from  scott.test_coll_nested;
        DEPARTEMENT----------EMPLOYEES-----------------------------------
             2                                T_TAB2_EMP('123', '456', '789', '101', '120', '114', '45')