嵌套表和对象表.docx
- 文档编号:15287290
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:11
- 大小:18.50KB
嵌套表和对象表.docx
《嵌套表和对象表.docx》由会员分享,可在线阅读,更多相关《嵌套表和对象表.docx(11页珍藏版)》请在冰点文库上搜索。
嵌套表和对象表
嵌套表
嵌套表是表中之表。
一个嵌套表是某些行的集合,它在主表中表示为其中的一列。
对主表中的每一条记录,嵌套表可以包含多个行。
在某种意义上,它是在一个表中存储一对多关系的一种方法。
考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。
在一个严格的关系模型中,将需要建立两个独立的表department和project。
嵌套表允许在department表中存放关于项目的信息。
勿需执行联合操作,就可以通过department表直接访问项目表中的记录。
这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。
甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。
在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。
二、举例说明嵌套表的使用:
假设有一个关于动物饲养员的表,希望其中具有他们饲养的动物的信息。
用一个嵌套表,就可以在同一个表中存储饲养员和其饲养的全部动物的信息。
1、创建类型animal_ty:
此类型中,对于每个动物都包含有一个记录,记载了其品种、名称和出生日期信息。
CREATETYPEanimal_tyASOBJECT(
breedvarchar2(25),
namevarchar2(25),
birthdatedate);
2、创建animals_nt:
此类型将用作一个嵌套表的基础类型。
CREATETYPEanimals_ntastableofanimal_ty;
3、创建表breeder:
饲养员的信息表
createtablebreeder
(breedernamevarchar2(25),
animalsanimals_nt)
nestedtableanimalsstoreasanimals_nt_tab;
4、向嵌套表中插入记录
insertintobreeder
values('03y',animals_nt(animal_ty('dog','butch','31-03-97'),
animal_ty('dog','rover','31-03-97'),
animal_ty('dog','julio','31-03-97')));
insertintobreeder
values('jane',animals_nt(animal_ty('cat','an','31-03-97'),
animal_ty('cat','jame','31-03-97'),
animal_ty('cat','killer','31-03-97')));
commit;
5、查询嵌套表
selectname,birthdatefrom
table(selectanimalsfrombreeder);
selectname,birthdatefrom
table(selectanimalsfrombreeder
wherebreedername='03y');
selectbreedername,name,birthdatefrom
breedera,table(a.animals)b
三、嵌套表的特点:
1、对象复用:
如果编写面向对象的代码,就提高了重用以前编写的代码模块的机会。
同样,如果创建面向对象的数据库对象,也就提高了数据库对象能够被重用的机会。
2、标准支持:
如果创建标准的对象,那么它们被重用的机会就会提高。
如果有多个应用或多个表使用同一数据库对象集合,那么它就是既成事实的数据库对象标准。
3、定义访问路径:
对于每一个对象,用户可定义在其上运行的过程和函数,从而可以使数据和访问此数据的方法联合起来。
有了用这种方式定义的访问路径,就可以标准化数据访问的方法并提高对象的可复用性。
对象表
在Oracle中把对象作为一种数据类型object,不但可以包含基本的数据类型、集合,还可以为其定义函数和过程作为其方法。
创建格式如下:
createorreplacetypepersonasobject
(
NAMEvarchar2(10),
SEXchar
(2),
BIRTHDATEdate,
PLACEvarchar2(100)
);
注意:
不能在数据类型中定义以下类型:
1.LONG、LONGRAW
2.ROWID
3.PL/SQL特定类型(BINARY_INTEGER、BOOLEAN、%TYPE、%ROWTYPE)
4.程序包中自定义的数据类型
构造函数
使用之前创建的对象建立构造函数:
declare
person_oneperson;
begin
person_one:
=person('张三','男',date'2008-10-11','杭州');
dbms_output.put_line(person_one.name);
end;
说明:
先创建了一个person类型的局部变量,再为该变量创建了一个实例。
在实例化中用到的person是系统的构造函数,可以对person类型变量进行赋值,该构造函数在对象创建时由系统自动创建,与对象的名称相同。
注:
创建对象实例时必须提供全部参数,否则报错。
引用对象类型
可以创建实例化的对象之后,将该对象插入到堆表中。
1、例如创建含有person类型数据的表:
createtablet_person(
person_colperson,
emp_idnumber,
dep_idnumber);
2、直接插入数据:
insertintot_personvalues(person('张三','男',date'2008-10-11','杭州'),12345,11);
commit;
3、也可以在PL/SQL中先创建保存实例的变量,再进行插入:
declare
person_oneperson;
begin
person_one:
=person('李四','男',date'2008-10-20','上海');
insertintot_personvalues(person_one,12345,11);
commit;
end;
4、之后可进行查询数值:
SQL>select*fromt_person;
PERSON_COL(NAME,SEX,BIRTHDATE,PLACE)EMP_IDDEP_ID
---------------------------------------------------------------
PERSON('张三','男','11-OCT-08','杭州')1234511
PERSON('李四','男','20-OCT-08','上海')1234511
5、若需要查询对象中的某个变量,则必须在最前面加上表名:
SQL>selecta.person_col.NAMEfromt_persona;
PERSON_COL.NAME
----------------
张三
李四
注:
当在某表中加入对象后,对象在table被drop之前不能被drop。
方法
对象类型内的function和procedure都是方法,可以重载。
Oracle的对象类型共有5种方法:
实例方法、类方法、构造函数、映射方法、排序方法。
1、实例方法和类方法
实例方法是必须创建实例后才可以调用的方法,而类方法可以在创建实例前调用。
实例方法用member声明,类方法用static
创建type和typebody:
createorreplacetypepersonasobject
(
NAMEvarchar2(10),
SEXchar
(2),
BIRTHDATEdate,
PLACEvarchar2(100),
memberprocedurechang_name(namevarchar2),
staticfunctionnew(v_namevarchar2,v_sexvarchar2)returnperson
);
createorreplacetypebodypersonis
memberprocedurechang_name(namevarchar2)is
begin
self.name:
=name;
endchang_name;
staticfunctionnew(v_namevarchar2,v_sexvarchar2)returnperson
is
begin
return(person(v_name,v_sex,null,null));
endnew;
end;
在过程中调用两种不同类型的方法:
declare
person_oneperson;
person_twoperson;
begin
person_one:
=person('李四','男',date'2008-10-20','上海');--创建实例
person_one.chang_name('王五');
dbms_output.put_line(person_one.name);
person_two:
=person.new('小张','女');--可直接调用
dbms_output.put_line(person_two.name);
end;
2、映射方法
由于将对象作为字段时,对象中包含很多参数须发进行比较,此时可以为对象创建映射方法。
在创建映射方法后,如果用到where或orderby以及<>=等比较关系时,自动调用映射方法。
注:
映射方法不带参数,且只能有一个。
创建type和typebody:
createorreplacetypepersonasobject
(
NAMEvarchar2(10),
SEXchar
(2),
BIRTHDATEdate,
PLACEvarchar2(100),
mapmemberfunctioncomparereturndate
);
createorreplacetypebodypersonis
mapmemberfunctioncomparereturndateis
begin
returnself.birthdate;
endcompare;
end;
调用映射方法进行比较:
declare
person_oneperson;
person_twoperson;
begin
person_one:
=person('李四','男',date'2008-10-20','上海');
person_two:
=person('小张','女',date'2008-10-11','杭州');
ifperson_one>person_twothen
dbms_output.put_line(person_one.name||'比'||person_two.name||'大');
elsifperson_one dbms_output.put_line(person_two.name||'比'||person_one.name||'大'); elsedbms_output.put_line('一样大'); endif; end; 3、排序方法 排序方法主要为了简化比较对象大小的值,相当于sign 举例说明,创建type和typebody: createorreplacetypepersonasobject ( NAMEvarchar2(10), SEXchar (2), BIRTHDATEdate, PLACEvarchar2(100), ordermemberfunctionmatch(p_personperson)returninteger ); createorreplacetypebodypersonis ordermemberfunctionmatch(p_personperson)returnintegeris begin ifself.birthdate>p_person.birthdatethen return1; elsifself.birthdate return-1; elsereturn0; endif; endmatch; end; 调用排序函数: declare person_oneperson; person_twoperson; kint; begin person_one: =person('李四','男',date'2008-10-20','上海'); person_two: =person('小张','女',date'2008-10-11','杭州'); k: =person_one.match(person_two);--one调用match去和two比较 dbms_output.put_line(k); end; 注: 当排序大量对象时,适合用MAP,当反复比较时,适合用ORDER
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌套 对象