Oracle 对象关系数据库_第1页
Oracle 对象关系数据库_第2页
Oracle 对象关系数据库_第3页
Oracle 对象关系数据库_第4页
Oracle 对象关系数据库_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle8对象关系数据库高端数据库-提高DBMS管理上限Oracle8对象关系数据库扩充的类型系统对象关系数据库Oracle8数据库系统

一、高端数据库-提高DBMS管理上限

oracle7 oracle8

数据库大小 32TB 512KTB 数据文件个数 1-4K 64-256M每表包含列 数 254 1000 每表的LOB列数 1long 1000 CHAR长度 254 2000VARCHAR长度 2000 4000索引列数 16 32 支持上万个并发用户多线程服务器(用少量的服务器端进程管理大量的客户端用户。Net8(SQL*net)连接管理器—连接池(TNS资源)、多路传输、应用请求集中化更有效地使用网络资源避免操作系统对服务器网络连接数的限制客户端(服务器)服务器一、高端数据库-提高DBMS管理上限网络层透明网络底层协议适配器二、扩充的类型系统

-对象关系数据库

关系模型与对象模型新的数据类型-对象(记录)类型对象表—面向对象数据库设计收集类型(数组与嵌套表)

对象与视图

数据库新的应用领域计算机辅助设计

CAD数据库必须存储和处理与工程设计相关的数据(产品部件及相互关系、设计版本…)计算机辅助软件工程数据库中存储软件开发人员用到的各种数据,包括源代码、模块之间依赖关系、变量定义、文档…多媒体数据库声音、视频、图象…办公信息系统超文本数据库应用需要新的数据类型——论文检索系统论文标题作者列表(第一作者,第二作者,找出某人参与撰写的所有论文…)检索关键字发表日期(年月日分开)传统关系数据库的数据类型复杂属性只能拆分成并列的单一属性姓名,地址(省、市、区、街道、门牌号)本来是一个结合紧密的整体,在关系数据库中却只能拆成单一属性,与其他属性并列(如姓名、年龄等),没有反映出它们的紧密关系。无法表示变长的属性家庭记录有几个孩子长字段设几个字段(不好估计)家庭编号户主子女1子女2子女3…传统关系数据库的数据类型无法直接表示嵌套表例:一张发货单,发三种货物:放3条记录,但公共信息存3遍(查询方便)拆成两张表(发货单,发送货物),需要连接,费时,且要清楚表与表的关系货单号发货人货物日期…发往地货物名称价格数量关系数据库的数据模型数据模型是模型化数据和信息的工具。现实世界认识抽象信息世界-概念数据模型机器世界-DBMS支持的数据模型关系模型转换数据模型演演变文件系统(OS)层次模型———网状模模型——关关系模型(DB)特点:面向记录,,信息由定定长记录组组成。记录简单((短小)。。原子字段,,字段不再再含有结构构。关系模型的的特点强调数据的的独立性((以数据为为中心),,数据与程程序分离。。采用关系模模型、概念念单一,实实体和联系系都是用关关系来表示示。关系必须是是规范化的的关系,要要求每一分分量不可再再分。支持关系语语言,具有有高度非过过程化,支支持集合运运算通过外来码码实现表的的连接(多多表查询))Oracle8—扩扩充的类类型系统是对关系数数据模型进进行的扩充充。提供更为丰丰富的面向向对象的类类型系统。。扩充的类型型系统允许许元组的属属性值为复复杂类型,,在关系查查询语言中中增加处理理新数据类类型的成分分。既保留关系系模型基础础又提高建模模能力对象关系模模型为希望望使用面向向对象特征征的关系数数据库用户户提供可能能。面向对象的的基本概念念面向对象方方法是以要要解决的问问题中所涉涉及到的各各种对象为为主要考虑虑因素。对象是一种种看问题的的观点,是是对现实世世界各种元元素的一种种抽象。对对象既含数数据又含功功能,因此此具有自身身处理数据据的能力。。对象被认认为是迄今今为止最接接近真实事事物的数据据抽象。现实世界中中对象有两两个共同的的特点:一方面,它它们都有自自己的状态态。如一台台电视机有有自己的摆摆放位置,,有关机和和开机状态态,此刻正正在播放某某一频道的的电视节目目等另一方面,,它们又都都有自己的的行为,如如电视机的的开机、关关机、调台台等。面向对象的的基本概念念内部实现(封装)接口属性、方法法能动的主体体使电脑贴近近人脑的思思维模式((减少人认认识问题时时的认识空空间和计算算机处理问问题时的方方法空间的的不一致性性)。实现软件的的复用(软软件芯片))。对象的属性性与方法面向对象程程序设计中中的对象是是现实世界界对象的模模型化,它它同样具有有状态和行行为。对象的状态态用属性来来维护,对象的行为为用方法来来实现。因此可以简简单地讲,,对象是面面向对象的的程序设计计模式,它它由描述对对象状态的的属性(变变量)和用用来实现对对象行为的的方法(代代码)组成成。对象与类相关对象的的集合称为为类(Class)类是对象的的抽象及描描述,它是是具有统一一属性和方方法的多个个对象的统统一描述体体,是用来来定义一组组对象共有有属性和方方法的模板板。类是用来创创建对象实实例的样板板,它包含含所创建对对象的状态态描述和方方法的定义义。类是一一个型,而而对象则是是这个型的的一个实例例。类是静态概概念,而对对象则是一一个动态概概念,因为为只有在运运行时才给给对象分配配空间,对对象才真正正存在。面向对象的的数据模型型在一些应用用中,用户户将数据库库中的数据据看作是一一组对象而而非一组记记录。面向对象的的数据模型型是面向对对象程序设设计思想在在数据库系系统中的应应用。基本思想——将数据和和操作这些些数据的程程序代码封封装在一个个对象里。。将一个对象象存储在数数据库中::对象的数据据部分必须须针对各个个对象分别别存储。而实现类方方法的程序序代码应该该和类的定定义一起作作为数据库库模式的一一部分存储储。面向对象数数据库数据库中不不是只存储储单纯的数数据,而是是存储包含含属性和方方法的对象象。对于一个数数据库对象象,可定义义在其上运运行的过程程和函数。。使数据库库中的数据据和访问该该数据的方方法联系起起来,可标标准化数据据访问的方方法并提高高对象的可可复用性。。应用逻辑从从应用程序序中移动到到数据库中中(对象方方法)创建通用的的数据库对对象,并能能成为数据据库对象的的标准,可可实现数据据库对象的的重用。数据模型现实世界认识抽象信息世界--概念数据据模型机器世界--DBMS支持的数据据模型对象模型转换对象模型与与关系模型型对象模型对象类型的的属性描述述对象类型的的方法封装装了操作该该对象的代代码。提供供了处理数数据库中数数据的界面面。关系模型二维表中列列的定义没有方法另编程可使用操作作某数据库库表的存储储过程。面向对象数数据模型中中的类概念念—实体集集概念。面向对象数数据模型中中的对象概概念—实体体概念对象模型与与关系模型型关系模型可可用二维表表来表示———关关系表:属性—二二维表表的列元组—二二维表表的行对象模型可可用二维表表来表示———对对象表:用一个类类(对象类类型)定义义一个对象象表类的属性——二维维表的列对象(类的的实例)——二二维表的的行(行对对象)通过对象调调用对象方方法。Oracle的扩充充类型Oracle是一个开放放的类型系系统,增加加了复杂的的数据类型型以及用户户自定义类类型用户定义义的数据据类型使使得可以以在数据据库中为为现实世世界的对对象建模模对象类型型(记录录类型))数组类型型嵌套表类类型创建对象象表,实实现面向向对象的的数据库库设计((而非关关系型数数据库设设计。应用逻辑辑从应用用程序中中移动到到数据库库中(对对象方法法)扩充类型型的不同同应用对象类型型数数组类型型嵌嵌套表类类型关系表对对象表对象类型利用对象象类型定定义复复合数据据类型用户自定定义数据据类型使用对象象类型定定义一个个记录数数据类型型CREATETYPEname_typeASOBJECT(first_nameVARCHAR2(4),last_nameVARCHAR2(4));CREATETYPEaddress_typeASOBJECT(cityVARCHAR2(10),streetVARCHAR2(10),zipNUMBER(6));CREATETABLEworker(widNUMBER(5)PRIMARYKEY,wnamename_type,addressaddress_type);对象类型型数据的的操作使用对象类型型声明了关系表中的列,DML语句必须须用一些些特殊的的语法插入新记记录时,,对于对对象类型型的列,,要使用用构造函函数构造造出对应应类型的的数据。。构造函数数是对象象类型的的特殊方方法,利利用此方方法为该该类型创创建对象象。构造造方法的的名称与与对象类类型(类类)同名名。对记录型型数据的的分量进进行操作作时,要要使用““别名””对象类型型数据的的操作插入语句句例:insertintoworkervalues(1,name_type('王','至远'),address_type('北京','白颐颐路5号号',100084));insertintoworkervalues(2,name_type(‘张’,‘‘大年'),address_type(‘天津’,‘康宁宁里20号’,300072));insertintoworkervalues(3,name_type('赵','力平'),address_type('上海','南京京路23号',200092));对象类型型数据的的查询查询语句句1select*fromworker;WIDNAME(FIRST_NAME,LAST_NAME)ADDRESS(CITY,STREET,ZIP)-----------------------------------------------------------------------------------------------------1NAME_TYPE(‘王’,‘‘至远远’)ADDRESS_TYPE('北京','白白颐路5号',100084)2NAME_TYPE(‘张’,‘‘大年年’)ADDRESS_TYPE(‘天津’,‘康康宁里20号’’,300072)3NAME_TYPE(‘赵’,‘‘力平平’)ADDRESS_TYPE(‘上海’,‘南南京路23号’’,200092)查询语句句2selectwid,wnamefromworker;WIDNAME(FIRST_NAME,LAST_NAME)----------------------------------------------------------1NAME_TYPE(‘‘王’,‘‘至远远’)2NAME_TYPE(‘张’,‘‘大年年’)3NAME_TYPE(‘赵’,‘‘力平平’)对象类型型数据的的查询查询语句句3((用别别名)selectwid顾客编号号,城市,街道,邮编fromworkerw;顾客编号号城城市市街街道道邮邮编编-------------------------------------------------1北北京白白颐路5号1000842天天津康康宁里20号3000723上上海南南京路23号200092查询语句句4(别名名的使用用)select*对象类型型数据的的操作修改updateworkerwsetw.address.zip=100083wherewid=1;删除deletefromworkerwherewid=1;.first_name=‘‘王’;修改表结结构altertablecustadd(address1address_type);不能对表表修改自定义的的数据类类型格式式用户自定定义数据据类型对象类型型更加贴贴近现实实世界的的数据特特征。使用对象象类型可可以更加加统一、、自然地地声明和和操作表表中的数数据(在整个数数据库中中地址一一致性))创建可为为大家引引用的新新数据类类型:创建一个个模式(如pub)建立公共共对象类类型(新新数据类类型)设置必要要的权限限使用CREATEPROCEDUREnew_worker(widNUMBER,_type,addresspub.address_type)自定义数据类类型上的索引引createindexaaaonworker(wname);ORA-02327:无法在具有数数据类型ADT的列上创建索索引。(即使在name_type类中定义了排排序方法也不不可以)如经常进行如如下查询:selectwid顾客编号,城市,街道,邮编fromworkerwwherew.address.zip=100084;可建索引如下下:createindexI_ziponworker(address.zip);使用对象表——面面向对象数据据库设计建立对象表的的类建类型(对象象类型声明))createtype类型名asobject(属性名1类类型说明,,属性名2类类型说明,,…...memberfunction函数名(参参数说明)return返回类型,memberprocedure过程名(参数数说明),…);方法说明属性说明对象属性类型型对象类型必须须包含一个或或多个属性,属性的类型型可以是:Oracle的原始数据类类型、LOB对象对象的引用((REF)收集(COLLECTION))等对象方法方法是一个过过程或函数,是对象类类型定义的一一部分,是程程序员编写的的用于操纵对对象属性的子子程序,被封封装在对象类类型中。方法的种类::成员方法(member)构造方法(constructor)MAP或ORDER方法(排序方方法)一个类可以有有多个方法((也可以不定定义方法)对象类型不存存储数据;必必须创建相应应的表来存储储数据编写方法代码码建类型体(实实现类成员方方法)createtypebody类型名ASmemberfunction函数方法名(参数说明明)return返回类型is说明部分begin执行部分end;memberprocedure过程方法名(参数说明)is说明部分begin执行部分end;END;方法实现方法实现建立对象表建对象表Createtable表名of对象类型(……);例:CREATETYPEemployee_typeASOBJECT(...);CREATETABLEemployeesOFemployee_type(empnoconstrainte1primarykey);CREATETYPEBODYemployee_type(…);表定义的其他他说明,如完完整性约束等等,表的列不不能再定义建立对象类型型例CREATETYPEemployee_typeASOBJECT(empnoNUMBER(3),enameVARCHAR2(10),salNUMBER(6.2),hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER));/创建对象表CREATETABLEemployeesOFemployee_type(PRIMARYKEY(empno),UNIQUE(ename),CHECK(sal>300));建立对象类型型体CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)ISBEGINUPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno;END;END;对方法的限制制编译软件包中中的函数或过过程时,可可以使用PRAGMA编译指令通知知PL/SQL编译器禁止某某方法对数据据库表和包中中的变量读写写,当方法法体中出现违违反情况时,编译出错错。格式:PRAGMARESTRICT_REFERENCES(function_name,WNDS[,WNPS][,RNDS][,RNPS]);WNDS不允许写数据据库RNDS不允许读数据据库WNPS不允许改程序序包变量RNPS不允许引用程程序包变量对方法的限制制CREATEORREPLACETYPEemployee_typeASOBJECT(empnoNUMBER,enameVARCHAR2(10),salNUMBER,hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,WNDS,WNPS));对方法的限制制CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);UPDATEemployeesSEThiredate=hiredate+30;--END;…..END;-----------------------------------------------------------------------0/0PL/SQL:Compilationunitanalysisterminated2/10PLS-00452:子程序'DAYS_AT_COMPANY'违反了它的相相关编译指令令对象类型--构造子方法法Oracle自动地为每个个对象类型创创建一个构造造方法。构造子方法的的名称采用对对象类型名。。构造子方法的的参数即对象象类型的所有有属性。构造子方法初初始化一个对对象类型的实实例,并将将它的属性赋赋值。例:insertintoemployeesvalues(employee_type(1,‘‘Jone’’,500,‘5-10月-1989’));对象表操作建表createtableemployeesofemployee_type;插入数据insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));insertintoemployees--省略构造造方法values(1,‘‘Jone’’,1500,‘5-10月-1989’);insertintoemployeesvalues(2,'smith',700,‘10-5月-1997');insertintoemployeesvalues(3,‘‘king’’,900,’25-12月-2000’);获取行对象——value函数value(对象表别名))返回一个行行对象(对象象类型)value用于从对象表表中取得对象象实例。不使用value,SELECT只能返回一个个对象的各个个列值。select*fromemployees;EMPNOENAMESALHIREDATE----------------------------------------------------------------------------------1Jone150005-10月-892smith70010-5月-973king90025-12月-00selectvalue(e)fromemployeese;VALUE(E)(EMPNO,ENAME,HIREDATE)--------------------------------------------------------------------EMPLOYEE_TYPE(1,'Jone',1500,‘‘05-10月-89')EMPLOYEE_TYPE(2,’smith',700,'10-5月-97')EMPLOYEE_TYPE(3,’king',900,‘25-12月-00')对象表方法调调用selectename,hiredatefromemployeeswhereempno=1;EMPNAMEHIREDATE--------------------------------------------Jone05-10月-89selectename,e.days_at_company()daysfromemployeesewhereempno=3;EMPNAMEDAYS-----------------------------------------------------------------------------------------------------------------king45使用别名在PL/SQL程序中,取得得的对象实例例必须被相同同类型的对象象变量接收。。例:declareempemployee_type;beginselectvalue(e)intoempfromemployeesewhereempno=1;emp.raise_salary(500);end;/PL/SQL中对象方法的调调用PL/SQL中对象方法的调调用DECLAREemp_variable employee_type;days_employed number;BEGINSELECTVALUE(e)INTOemp_variableFROMemployeeseWHEREe.empno=3;days_employed:=emp_variable.days_at_company();dbms_output.put_line(‘Daysemployed:‘||to_char(days_employed));END;/附:PL/SQL输出与环境设设置执行结果:Daysemployed:26PL/SQL输出(利用包包过程)dbms_output.put_line(‘…’);环境设置execdbms_output.enablesetserveroutputon对象方法小结结对象类型总是是有1到多个个方法(构造造方法是隐含含方法,成员员方法为0~n个。成员方法可以以带输入输出出参数。每个成员方法法含有名为SELF的隐隐含第一参数数,它具有与与对象类型自自身相同的类类型。定义函数方法法,如没参数数不用写括号号,但调用时时要写括号。。定义方法形形参时,类型型不用写长度度,如varchar2对象表的特性性对象表是只用用对象类型定定义的数据库库表,不含关关系型列。对象表的列对对应(用来创创建表的)对对象类型的属属性。对象表的行是是表类型的对对象(实例),每一行都都有一个系统统分配的唯一一的对象标识识符(OID)对象ID(OID)是每一个行对对象的唯一描描述符,是全全局唯一的,并且可以引引用OID不用于定位数数据,ROWID仍用于定位数数据oracle通过对象引用用实现数据库库中不同对象象之间的联系系(与关系表表完全不同))获取对象引用用—ref函函数具有OID的对象实例可可以被引用(REF)ref(对象表的别名名)返回对象表实实例指针,即即行对象的引用。例:selectref(e)fromemployeese;REF(e)------------------------------------------------------------------------------------------------------------------------------------------------------------------000028020965D...0BEFE0340800209ADC5901403BE50000000028020965D...0BEFE0340800209ADC5901403BE50001000028020965D...0BEFE0340800209ADC5901403BE50002对象引用例建立对象表custCreatetypecust_typeasobject(custid number(5),namename_type,addressaddress_type);createtablecustofcust_type(custidprimarykey);对象引用例向cust表中插入数据据insertintocustvalues(1,name_type('王','至远远'),address_type(‘北京’’,‘‘白颐颐路5号’’,100084));insertintocustvalues(2,name_type(‘张’,‘大大年'),address_type('天津','康宁宁里20号号',300072));insertintocustvalues(3,name_type('赵','力力平'),address_type('上海','南京京路23号号',200092));对象引引用例例查询cust表select*fromcustwherecustid=1;.first_name=‘‘王’;修改cust表结构构???altertablecustadd(address1address_type);不允许许!!!!对象引引用例例建立goods_typeCREATETYPEgoods_typeASOBJECT(gnoNUMBER(3),gnamevarchar2(20),pricenumber(6,2));/CREATETABLEgoodsOFgoods_type(constraintp1primarykey(gno));INSERTINTOgoodsVALUES(101,'电视机机',2900);INSERTINTOgoodsVALUES(102,'洗衣机机',1500);对象引引用例例CREATETYPEorder_typeASOBJECT(orderidNUMBER(3),customerREFcust_type,orderdateDATE,qtyNUMBER(5),gnoNUMBER(3));/CREATETABLEordersOForder_type(FOREIGNKEY(gno)REFERENCESgoods(gno));对象引引用例例----customer----gnonumberorders----2张张大大年----custgno----goodsOID=对象表表—对对象引引用REF是指向向行对对象的的指针针,易易于实实现表表和表表之间间的联联系,,对象象之间间连接接不再再需要要关系系表的的连接接(JOIN))操作。。将对象象表的的表别别名作作为REF的参数数,可可以取取得对对应OID的引用用值。。引用只只能用用于具具有OID的对象象。customerREFcust_typeSCOPEISCUSTSCOPE子句用用于限限定一一个引引用在在一个个指定定表中中,这这样可可以提提高查查询性性能,,并减减少存存储指指针的的空间间。INSERTINTOordersSELECT1,ref(c),‘‘7-1月-2000’’,165,101FROMcustcWHEREcustid=1;UPDATEordersSETcustomer=(SELECTREF(c)FROMcustcWHEREcustid=2)WHEREorderid=1;引用类类型数数据的的操作作引用类类型数数据的的操作作SELECTcustomerFROMordersWHEREorderid=1;22020865F009D0AC262…42A35E0340800…顾客号号,名,orderdate日期FROMordersoWHEREorderid=1顾客号号名名日日期---------------------------2大年07-1月-00对象引引用——简化化了代代码数据库库管理理对象象间的的连系系,用用户只只需通通过属属性进进行对对象的的引用用。在关系系设计计中,开开发人人员必必须使使用联联接(JOIN)SELECTname,address,...FROMorderso,custcWHEREo.custid=c.custidandorderid=1;deref函数数deref(ref指针))返回回指针针指向向的对对象本本身例:selectderef(customer)fromorderswhereorderid=1;DEREF(CUSTOMER)(CUSTID,NAME(FIRST_NAME,LAST_NAME),ADDRESS(CITY,STREET,ZIP))---------------------------------------------------------------------------------CUST_TYPE(2,NAME_TYPE(‘张张’,‘‘大年年’),ADDRESS_TYPE(‘‘天津津’,‘‘康宁宁里20号号’,300072))试比较较:selectderef(ref(c))fromcustcwherecustid=2;和selectvalue(c)fromcustcwherecustid=2;SQL语句句中的的排序序和比比较传统的的数据据类型型主要要为标标量数数据类类型::number,char,date标量数数据类类型可可以排排序((如orderby……)排序在在SQL语句的的使用用:关系运运算((><=)between及in的判断断orderbygroupbydistinct子句句unique和primarykey约束束自定定义义数数据据类类型型如如何何排排序序selectwname,addressfromworkerorderbyaddress;错误误位位于于第第2行行::ORA-22950:无法法ORDER没有有MAP或ORDER方法法的的对对象象对象象类类型型的的排排序序方方法法同类类的的排排序序对对支支持持用用户户定定义义的的对对象象类类型型很很重重要要。。对象象类类型型由由于于结结构构复复杂杂,必必须须借借助助方方法法实实现现排排序序和和比比较较。。MAP方法法将将对对象象类类型型转转换换为为传传统统数数据据类类型型。。ORDER方法提供供排序规规则。比比较本对对象和另另一对象象实例,并返返回1,0,-1分别代表表大于、等等于、小小于。一个对象象类型只只能有一一个MAP方法或一一个ORDER方法:mapmemberfunction…ordermemberfunction……MAP方方法例例对象类型型---->标标量类类型方法返回回一个传传统数据据类型用用于排序序。没有输入入参数(只有一一个隐含含参数SELF)。方法被隐隐含调用用。在类型定定义中说说明MAP方法:CREATETYPEname_typeASOBJECT(first_namevarchar2(4),last_namevarchar2(4),MAPMEMBERFUNCTIONname_mapRETURNvarchar2);在类型体体中实现现MAP方法:CREATETYPEBODYname_typeASMAPMEMBERFUNCTIONname_mapRETURNvarchar2ISBEGINRETURNfirst_name||last_name;END;END;排序:FROMcustcORDERBYnamedesc;任何基于于name_type类型的的排序按按名称的的拼接串串作为大大小比较较的依据据。MAP方方法例例MAP方方法隐含含调用ORDER方法决定类型型实例的的序列关关系。有一个参参数(外外加一个个隐含的的参数SELF)函数方法法返回一一个整数数如果对象象自身比比参数对对象小,返回回-1如果对象象自身与与参数对对象相等等,返返回0如果对象象自身比比参数对对象大,返回回1ORDER方法例1在类型定定义中声声明order方法:CREATEorreplaceTYPEaddress_typeASOBJECT(cityVARCHAR2(10),streetVARCHAR2(10),zipNUMBER(6),ORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGER);在类型体体中实现现方法::CREATEORREPLACETYPEBODYaddress_typeASORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGERISBEGINIFself.zip<other_address.zipTHENRETURN1;ELSIFself.zip>other_address.zipTHENRETURN-1;ELSERETURN0;ENDIF;END;END;ORDER方法例1邮编数小小的地址址大ORDER方法例1排序:_name姓,名,城市,邮编fromcustcorderbyc.addressdesc;排序结果果:姓名名城城市邮邮编------------------------------------------------王至至远远北北京100084赵力力平平上上海200092张大大民民天天津300072ORDER方法例2CREATEORREPLACETYPEemployee_typeASOBJECT(empnoNUMBER(3),enameVARCHAR2(10),salNUMBER(6.2),hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,WNDS,WNPS),ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGER);ORDER方法例2CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)ISBEGINUPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno;END;ORDER方法例2ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGERISBEGINRETURNFLOOR(-(SELF.hiredate-other_emp.hiredate));END;END;/ORDER方法例2select*fromemployeeseorderbyvalue(e);--按对象大大小排序序EMPNOENAMESALHIREDATE------------------------------------------------3king90025-12月-002smith70010-5月-971Jone150005-10月-89对象类型型维护ALTERTYPEemployee_typeREPLACEASOBJECT(empnoNUMBER,enameVARCHAR2(10),salNUMBER,hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,wnds,wnps),对象类型型维护ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGER,MEMBERFUNCTIONmonth_at_company--新方法RETURNNUMBER,PRAGMARESTRICT_REFERENCES(month_at_company,wnds));/对象类型型维护CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)ISBEGINUPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno;END;对象类型型维护ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGERISBEGINRETURNFLOOR(-(SELF.hiredate––other_emp.hiredate));END;MEMBERFUNCTIONmonth_at_companyRETURNNUMBERISBEGINRETURNmonths_between(sysdate,hiredate);END;END;/对象类型型信息与类型有有关的数数据字典典视图user_typestype_nameattributesmethods……user_type_attrstype_nameattr_namelengthattr_type_name……user_type_methodstype_namemethod_name……对象类型型信息查看对象象类型selecttype_name,attributes,methodsfromuser_types;TYPE_NAMEATTRIBUTESMETHODS--------------------------------------------------------------ADDRESS_TYPE31EMPLOYEE_TYPE31NAME_TYPE20columntype_nameformata20wrapcolumnattributesformat999wrapcolumnmethodsformat999wrap对象类类型信信息查看类类属性性定义义selectattr_name,length,attr_type_namefromuser_type_attrswheretype_name=‘‘ADDRESS_TYPE’;ATTR_NAMELENGTHATTR_TYPE_NAME-------------------------------------------------------------------CITY20VARCHAR2STREET30VARCHAR2ZIPNUMBER对象类类型信信息查看类类方法法定义义selecttype_name,method_namefromuser_type_methods;TYPE_NAMEMETHOD_NAME-----------------------------------------------ADDRESS_TYPEADDRESS_ORDEREMPLOYEE_TYPEDAYS_AT_COMPANYEMPLOYEE_TYPEMONTH_AT_COMPANYEMPLOYEE_TYPEEMP_ORDERNAME_TYPENAME_MAP对象类类型相相关性性在对象象和对对象类类型之之间存存在相相关树树。必必须保保证树树的完完整。。不允允许破破坏被被引用用的类类型。。例如::droptypename_type;当类型已已被引引用时时不让让删droptypename_typeforce;强行删删除,,再查查使用用该类类型定定义的的表时时出错错。name_typeaddress_type对象类类型相相关性性workercust_typeCustemployee_typeemployeesordersgoodsgoods_typeorder_type查看对对象相相关性性例:selectname,type,referenced_nameRname,referenced_typeRtypefromuser_dependencieswherename=‘ORDERS’’;NAMETYPERNAMERTYPE-------------------------------------------------------------------------ORDERSTABLESTANDARDPACKAGEORDERSTABLECUST_TYPETYPEORDERSTABLEORDER_TYPETYPE查看对对象相相关性性例:=‘‘CUST’nametypeRnameRtype---------------------------------------------------------------------------------------------------------------CUSTTABLESTANDARDPACKAGECUSTTABLENAME_TYPETYPECUSTTABLEADDRESS_TYPETYPECUSTTABLECUST_TYPETYPE例:select……referenced_name=‘‘cust_type’’;查看哪哪些对对象使使用了了cust_type类型。。查看对对象相相关性性例:=‘‘CUST_TYPE’’;nametypeRnameRtype-------------------------------------------------------------------------CUST_TYPETYPESTANDARDPACKAGECUST_TYPETYPENAME_TYPETYPECUST_TYPETYPEADDRESS_TYPETYPE列出依依赖树树:执行oracle根目录录/rdbms/admin/utldtree.sql生成两两个视视图deptree和ideptree程序视视图显显示依依赖树树。小结——对象象属性性和方方法当使用用表的的当前前行对对象时时,对对象属属性和和方法法的引引用必必须使使用表表的别别名,,而不不能是是实际际的表表名.first_name='王';selecte.days_at_company()fromemployeesewheree.empno=3;小结——列对对象与与行对对象列对象象:嵌嵌入型型对象象,作作为表表中的的列来来处理理的对对象,,要通通过主主表才才能访访问。。自定义义复合合数据据类型型可变数数组嵌套表表行对象象:不不是嵌嵌入型型对象象,而而是引引用型型对象象,可可以通通过其其他对对象的的引用用(ref)来访问问。列对象象没有有OID,而且不不能被被引用用。列对象象是基基于对对数据据库已已有功功能的的扩充充(自自定义义类型型)。。收集类类型Oracle的数据据类型型扩展展收集类类型实现一一对多多关系系的模模型化化。在关系系设计计中,,只能能通过过联接接(JOIN)实现表表的关关联,将将导致致复杂杂的运运算。。在对象象设计计中,,可以以通过过收集集实现现对象象类型型的关关联收集类类型记录数组表收集类类型--可可变数数组支持有有序的的一对对多的的关系系。可以在在一行行中存存储某某个记记录的的重复复属性性。可变,,但要要指定定数组组最大大容量量。数组元元素具具有相相同类类型,,可以以是基基本本类型型、REF或对象象类型型。但但不能能是嵌嵌套表表或可可变数数组类类型。。不能是是VARRAYOFLOB类型book数据结结构分析化化学相关图图Book_list_type(varray(5)ofvarchar2(10)borrower_type(sno,sname,class,books)borrower使用数数组类类型定义数数组类类型CREATETYPEbook_list_typeASVARRAY(5)OFVARCHAR2(10);建借阅阅者表表的类类型CREATETYPEborrower_typeASOBJECT(snoNUMBER(6),snameVARCHAR2(10),classVARCHAR2(10),booksbook_list_type,MEMBERFUNCTIONadd_book(bookVARCHAR2)RETURNbook_list_type,PRAGMArestrict_references(add_book,WNDS));在方法法中处处理数数组类类型数数据实现类类方法法CREATETYPEBODYborrower_typeASMEMBERFUNCTIONadd_book(bookvarchar2)RETURNbook_list_typeIStemp_arraybook_list_type;counterINTEGER;BEGINtemp_array:=SELF.books;counter:=temp_array.COUNT+1;temp_array.EXTEND;temp_array(counter):=book;RETURNtemp_array;END;END;建含有有数组组的对对象表表CREATETABLEborrowerOFborrower_type;收集类类型--收收集的的方法法收集(collection)的方法法:内内置置的函函数和和过程程函数方方法::EXISTS(n)当收集集类型型中指指定元元素存存在为为“真真”COUNT返回当当前收收集类类型中中的元元素个个数。。LIMIT返回可可变数数组元元素个个数的的上限限值FIRSTandLAST返回收收集中中第一一个和和最后后一个个元素素的下下标。。((对于于可变变数组组,总总是返返回1和count)PRIOR(n)andNEXT(n)返回指指定元元素的的前一一个和和后一一个元元素的的下标标。收集类类型--收收集的的方法法过程方方法::EXTEND扩充收收集的的大小小extend扩充一一个空空元素素extend(n)扩充n个空元元素extend(n,I)将收集集中第第I个元素素拷贝贝n份,追追加到到收集集中。。TRIM从收集集尾部部删除除元素素trim删除收收集中中最后后一个个元素素trim(n)删除收收集中中最后后n个元素素DELETE删除元元素delete删除收收集中中所有有元素素delete(n)删除收收集中中第n个元素素delete(m,n)删除收收集中中第m~n个元素素收集类类型--可可变数数组插入数数据INSERTINTOborrowerVALUES(980001,‘‘李星’’,‘‘力01’’,book_list_type(‘‘数据结结构’’,‘‘大学学物理理’));INSERTINTOborrowerVALUES(970025,‘‘王辰’’,‘‘化91’’,book_list_type(‘‘计算方方法’’,‘‘分析析化学学’));修改数数据((增加加一本本书))UPDATEborrowerbSETb.books=b.add_book('物理习习题集集')WHEREb.sno=980001;包含含可可变变数数组组列列的的查查询询查询询::selectsname,booksfromborrower;SNAMEBOOKS---------------------------------------------------------------------------李星星BOOK_LIST_TYPE('数据据结结构构','物物理理习习题题集集')王辰辰BOOK_LIST_TYPE(‘‘计算算方方法法’’,‘‘分分析析化化学学’’)查数数组组元元素素??selectb.sname,b.class,b.books(2)fromborrowerb错误误位位于于第第1行行::*ORA-00904:非法法的的列列名名可变变数数组组的的操操作作对数数组组元元素素的的检检索索不不能能简简单单地地用用select语句句,,而而应应在在PL/SQL里用用有有关关方方法法和和循循环环结结构构查查询询。。declarecursorc1isselect*fromborrower;beginforrinc1loopdbms_output.put_line(’’borrowername’’||r.sname);loopdbms_output.put_line(r.books(i));endloop;endloop;end;收集集类类型型方方法法例例在方方法法中中直直接接修修改改数数据据库库MEMBERPROCEDUREdel_book(bookvarchar2)ISold_booksbook_list_type;new_booksbook_list_type;iinteger:=1;jinteger;BEGINold_books:=SELF.books;new_books:=book_list_type();--初始始化化一一个个数数组组收集集类类型型方方法法例例WHILEi<=old_books.COUNT()LOOPIFold_books(i)=bookTHENi:=i+1;ELSEnew_books.EXTEND(1);j:=new_books.COUNT();new_books(j):=old_books(i);i:=i+1;ENDIF;ENDLOOP;UPDATEBORROWERSETbooks=new_booksWHEREsno=SELF.sno;END;END;/调用用方方法法declareb_objborrower_type;beginselectvalue(b)intob_objfromborrowerbwheresno=980001;b_obj.del_book('数据据结结构构');--调用用还还书书方方法法end;收集集类类型型方方法法例例还能能借借几几本本MEMBERFUNCTIONbnum_bookRETURNnumberIStemp_arraybook_list_type;BEGINtemp_array:=SELF.books;RETURNtemp_array.limit-temp_array.count;END;查询询可可再再借借几几本本书书selectb.bnum_book()fromborrowerbwheresno=980001;-----------------------------3收集集类类型型方方法法例例MEMBERPROCEDUREclear_bookISBEGINSELF.books.delete;UPDATEborrowerSETbooks=SELF.booksWHEREsno=SELF.sno;END;收集集类类型型-嵌嵌套套表表嵌套套表表是是包包含含在在其其它它表表((主主表表))中中的的表表。。嵌套套表表中中的的列列类类型型:基基本本类类型型或或对对象象类类型型。。嵌套套表表在在主主表表中中作作为为列列值值。。对嵌嵌套套表表的的操操作作,,首首先先要要定定位位它它——主主表表中中某某个个记记录录的的嵌嵌套套表表列列的的值值。。物理理上上嵌嵌套套表表与与主主表表分分开开存存放放,,用用另另外外一一个个表表存存储储主主表表的的一一个个嵌嵌套套表表列列。。该该表表的的存存储储参参数数可可以以单单独独设设置置对象象相相关关性性Book_tBook_nt_treaderBook_array_treader1booklist收集集类类型型--嵌嵌套套表表建立立数数据据类类型型,,该该类类型型将将作作为为嵌嵌套套表表的的结结构构类类型型CREATETYPEbook_tASOBJECT(bnochar(4),bnameVARCHAR2(10),r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论