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