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