嵌套表和对象表.docx

上传人:b****6 文档编号:15287290 上传时间:2023-07-03 格式:DOCX 页数:11 大小:18.50KB
下载 相关 举报
嵌套表和对象表.docx_第1页
第1页 / 共11页
嵌套表和对象表.docx_第2页
第2页 / 共11页
嵌套表和对象表.docx_第3页
第3页 / 共11页
嵌套表和对象表.docx_第4页
第4页 / 共11页
嵌套表和对象表.docx_第5页
第5页 / 共11页
嵌套表和对象表.docx_第6页
第6页 / 共11页
嵌套表和对象表.docx_第7页
第7页 / 共11页
嵌套表和对象表.docx_第8页
第8页 / 共11页
嵌套表和对象表.docx_第9页
第9页 / 共11页
嵌套表和对象表.docx_第10页
第10页 / 共11页
嵌套表和对象表.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌套表和对象表.docx

《嵌套表和对象表.docx》由会员分享,可在线阅读,更多相关《嵌套表和对象表.docx(11页珍藏版)》请在冰点文库上搜索。

嵌套表和对象表.docx

嵌套表和对象表

嵌套表

嵌套表是表中之表。

一个嵌套表是某些行的集合,它在主表中表示为其中的一列。

对主表中的每一条记录,嵌套表可以包含多个行。

在某种意义上,它是在一个表中存储一对多关系的一种方法。

考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。

在一个严格的关系模型中,将需要建立两个独立的表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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2