oracle中的集合数据类型,允许存储元素集合,有三种变长数组、嵌套表、关联数组(索引表)。前段写查号程序看了下变长数组、索引表。
嵌套表是嵌套在另一表中的表。可以插入、更新和删除嵌套表中的单个元素,可以存储任意个数目的元素。
嵌套表是任意数量元素的有序集合,所有元素是同一数据类型。嵌套表有单个列,该列的类型可以是内置的数据库类型,也可以是以前创建过的对象类型。

一、创建对象类型
SQL> create type name_typ as object(
  2  first_name   varchar2(30),
  3  second_name  varchar2(30),
  4  short_name   varchar2(10)
  5  );
  6  /
 
Type created

二、创建嵌套表类型
SQL> create type nested_table_name  as table of name_typ
  2  /
 
Type created
注:错误写法
create table nested_table_name  as table of name_typ
 
ORA-00928: missing SELECT keyword
应该是tyep而非table,就像用关键字count decode定义变量,会报缺少(的错误一样。

三、用嵌套表类型去定义表的列或者定义变量

SQL> create table test_jhj(
  2  id number(6) primary key,
  3  names nested_table_name
  4  )
  5  nested table
  6     names
  7  store as
  8     nested_names
  9  /
 
Table created

注:
create table test_jhj(
id number(6),
namees nested_table_name
)
 
ORA-22913: must specify table name for nested table column or attribute
定义的时候,记得用nested table 标识,嵌套表列的的名称。意指实际嵌套表列名为nested_names。

四、获得嵌套表相关的信息
SQL> desc nested_table_name;
 nested_table_name TABLE OF NAME_TYP
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 FIRST_NAME                                         VARCHAR2(30)
 SECOND_NAME                                        VARCHAR2(30)
 SHORT_NAME                                         VARCHAR2(10)
SQL> desc test_jhj;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------------------
 ID                                        NOT NULL NUMBER(6)
 NAMES                                              NESTED_TABLE_NAME

SQL> set describe depth 2
SQL> describe test_jhj
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------------------
 ID                                        NOT NULL NUMBER(6)
 NAMES                                              NESTED_TABLE_NAME
   FIRST_NAME                                       VARCHAR2(30)
   SECOND_NAME                                      VARCHAR2(30)
   SHORT_NAME                                       VARCHAR2(10)

SQL> select *
  2  from user_nested_tables/all_nested_tables
  3 
五、嵌套表的操作:增、删、改、查;
①增
表test_jhj可以看成1个家庭里 有多个成员 而每个成员有多个名字

SQL> insert into test_jhj values(1,nested_table_name(name_typ('张','金花婆婆','婆婆'),
  2  name_typ('杨','00','杨帅帅')
  3  )
  4  );
--------1号家庭有2名成员:小名分别为金花婆婆 杨帅帅



SQL> insert into test_jhj values(2,
  2  nested_table_name(
  3    name_typ('曹','妙妙草','苗苗'),
  4    name_typ('徐','0','海豹'),
  5    name_typ('狄','狄狄兔','海洋一饼'),
  6    name_typ('于','00','小鱼')
  7    )
  8  );
--------2号家庭有4名成员,昵称分别为苗苗 海豹 海洋一饼 小鱼

②查
SQL> select *
  2  from test_jhj
     where id=1

 
        I
----------
NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
--------------------------------------------------------------------------------
         1
NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
帅帅'))


③改
(1)随着时间的推移,1号家庭增加了一个nick为可可豆的成员

SQL> insert into table(select names from test_jhj where id=1
  2  )values(name_typ('苏','小可','可可豆'));

再看一下1号家庭的成员

SQL> select *
  2  from test_jhj
  3  where id=1;

        ID
----------
NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
--------------------------------------------------------------------------------
         1
NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
帅帅'), NAME_TYP('苏', '小可', '可可豆'))


(2)1号家庭nick为可可豆的同学 不叫苏小可 而叫莫小米
SQL>  update table(select names from test_jhj where id=1) name_nick
  2   set 
  3    value(name_nick)=name_typ('莫','小米','可可豆')
  4   where
  5    value(name_nick)=name_typ('苏','小可','可可豆')
  6  /

SQL> select *
  2  from test_jhj
  3  where id=1
  4  /

        ID
----------
NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
--------------------------------------------------------------------------------
         1
NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
帅帅'), NAME_TYP('莫', '小米', '可可豆'))

(3)名叫莫小米,nick为可可豆的小童鞋,离家出走了,从花名册中delete
SQL> delete
  2  from table
  3  (select names from test_jhj where id=1) name_nick
  4  where value(name_nick) = name_typ(
  5  '莫','小米','可可豆'
  6  );

1号家庭还有几个人?
SQL> select *
  2  from test_jhj
  3  where id=1
  4  /

        ID
----------
NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
--------------------------------------------------------------------------------
         1
NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
帅帅'))

 

 

----edit on 2010 06 30

 

posted on 2010-11-26 13:13  维也纳下午茶  阅读(333)  评论(0编辑  收藏  举报