---------------------用Oracle Object Option(Oracle对象选件)获得新型数据类型
---------------------Oracle Object Option(Oracle对象选件)是Oracle8服务器的一个可选组件﹐必须具备
---------------------该组件才能使用以下数据类型﹕<1>.对象数据类型;<2>.嵌套表;<3>VARRAY(数组);<4>.REF
---------------------Oracle8 Object Option 提供了一个新语句﹕Create Type﹐用它可以创建一个新数据类型
---------------------以后在创建表或另一个数据类型时可以使用它
--﹕创建一个新数据类型
Create Type v_new_datatype as Object
(
building varchar2(10),
room varchar2(10),
layout int
);
--创建一个含有新型数据类型的表
Create Table table_new_datatype
(
room_id varchar2(10),
room_name varchar2(10),
location v_new_datatype
);
--一个对象时由属性(为它定义的列)和方法(处理对象的函数和过程及其返回信息)构成
--在默认的情况下﹐Oracle为每个对象创建一个构造器(constructor)方法﹐这个构造器方法
--可以创建一个对象实例﹐当你为对象列指定一个值时﹐必须用这个构造器方法﹐它包含对象类型名﹐
--其后跟着圆括号括起来的属性值
--例子﹕用构造器方法为对象数据指定一个值
insert into table_new_datatype
(room_id,room_name,location)
values
('1002','room2',v_new_datatype('building2','room2',20));
--一旦创建了一个含有对象列的表﹐就可以使用select语句从对象列检索一个值﹐但是必须指定要检索的每个对象的属性
--例子﹕用对象列的名称修饰属性(列)
SELECT * FROM table_new_datatype;
select location.building,location.room from table_new_datatype; --不能执行﹖
select room_id,location from table_new_datatype;
SELECT location from table_new_datatype;
嵌套表:
嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。在一个严格的关系模型中,将需要建立两个独立的表department和project。
嵌套表允许在department表中存放关于项目的信息。勿需执行联合操作,就可以通过department表直接访问项目表中的记录。这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。
嵌套表的特点:
1、对象复用:如果编写面向对象的代码,就提高了重用以前编写的代码模块的机会。同样,如果创建面向对象的数据库对象,也就提高了数据库对象能够被重用的机会。
2、标准支持:如果创建标准的对象,那么它们被重用的机会就会提高。如果有多个应用或多个表使用同一数据库对象集合,那么它就是既成事实的数据库对象标准。
3、定义访问路径:对于每一个对象,用户可定义在其上运行的过程和函数,从而可以使数据和访问此数据的方法联合起来。有了用这种方式定义的访问路径,就可以标准化数据访问的方法并提高对象的可复用性。
-- 现创建一个学生信息成绩表Stu_Sco:包括学生信息和年月成绩,
-- 有如下字段:学号:stu_no,姓名:stu_nm,性别:sex,年龄:age和成绩嵌套表
-- 成绩嵌套表Score有如下字段:年月:ym,中文:CN,英语:EN,数学:MT
-- 现创建嵌套表 Score
Create Type Score_type as Object
(
YM CHAR(6),
CH number(4,2),
EN number(4,2),
MT number(4,2)
);
--创建新数据类型的表
Create Type Score_Tab as table of Score_type;
--创建一个具有嵌套表的嵌套表
create table Stu_Sco
(
stu_no varchar2(5) PRIMARY KEY,
stu_nm varchar2(10) NOT NULL,
sex CHAR(1),
age INT,
score Score_Tab --必须指定一个标识过的存储表
)NESTED TABLE score STORE AS stu_score_tab;
-- 写入数据
INSERT INTO stu_sco(stu_no,stu_nm,sex,age,score)
VALUES('00001','jake','1',22,Score_Tab(Score_type('200801',80,76,88),
Score_type('200802',78,77,90),
Score_type('200804',55,79,85))) ;
INSERT INTO stu_sco(stu_no,stu_nm,sex,age,score)
VALUES('00002','lucy','0',21,Score_Tab(Score_type('200801',81,71,88),
Score_type('200802',79,73,90),
Score_type('200804',8,79,75))) ;
-- 查询
SELECT * FROM stu_sco;
SELECT ch FROM TABLE(SELECT score FROM stu_sco WHERE stu_no='00001');
SELECT * FROM TABLE(SELECT score FROM stu_sco WHERE stu_no='00001') WHERE ym='200801';
SELECT a.stu_no,b.ym,b.ch,b.en,b.mt FROM stu_sco a,(SELECT * FROM TABLE(SELECT score FROM stu_sco WHERE stu_no='00001')) b
WHERE a.stu_no='00001';
可变数组 :
可变数组与嵌套表相似,也是一种集合。一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。从概念上讲,可变数组是一个限制了行集合的嵌套表。
可变数组,允许用户在表中存储重复的属性。例如:假设用户有一个project表,并在项目中指定了工作人员,一个项目可以有多个工人,而一个工人也可以为多个项目工作。在严格的关系模型中,用户可以创建一个project表,一个worker表和存储它们之间关系的交叉表project_worker。
用户可使用可变数组在project表中存储工人的名字。如果项目限定的工人数不超过10人,可以建立一个以10个数据项为限的可变数组。接下来就可处理此可变数组,从而对于每一个项目,可以选取其中所有工人的名字,而勿需查询表worker。
--举例说明可变数组的使用:
--1、创建类型comm_info
CREATE TYPE comm_info AS OBJECT ( --此类型为通讯方式的集合
no number(3), --通讯类型号
comm_type varchar2(20), --通讯类型
comm_no varchar2(30)); --号码
--2、创建可变数组comm_info_list
CREATE TYPE comm_info_list AS VARRAY(50) OF comm_info;
--3、创建表
create table user_info(user_id number(6), -- 用户ID号
user_name varchar2(20), -- 用户名称
user_comm comm_info_list); -- 与用户联系的通讯方式
--4、向可变数组插入记录
INSERT into user_info
VALUES(1,'mary',comm_info_list(comm_info(1,'手机','13651401919'),
comm_info(2,'呼机','12812345637'),
comm_info(3,'tele','23232323233')));
insert into user_info
VALUES(2,'carl',comm_info_list(comm_info(1,'手机','13901018888'),
comm_info(2,'呼机','1281234567')));
commit;
--5、查询可变数组
SELECT user_comm from user_info
WHERE user_id=1;
select comm_type,comm_no
FROM table(select user_comm from user_info
WHERE user_id=1)
WHERE no=1;
与一位用户联系的方式有很多种,比如:手机、呼机、座机等。在一个严格的关系模型中,将需要两个独立的表:用户信息和通讯方式,而在可变数组中,允许在表user_info中直接访问用户的联系方式,这种不经联合而直接选择数据的能力使得用户对数据的访问更加容易。
可变数组的特点:
1、对象复用:如果编写面向对象的代码,就提高了重用以前编写的代码模块的机会。同样,如果创建面向对象的数据库对象,也就提高了数据库对象能够被重用的机会。
2、标准支持:如果创建标准的对象,那么它们被重用的机会就会提高。如果有多个应用或多个表使用同一数据库对象集合,那么它就是既成事实的数据库对象标准。
3定义访问路径:对于每一个对象,用户可定义在其上运行的过程和函数,从而可以使数据和访问此数据的方法联合起来。有了用这种方式定义的访问路径,就可以标准化数据访问的方法并提高对象的可复用性。