版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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_name VARCHAR2(4),last_name VARCHAR2(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(empno NUMBER(3),ename VARCHAR2(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(empno NUMBER,ename VARCHAR2(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(orderid NUMBER(3),customer REFcust_type,orderdateDATE,qtyNUMBER(5),gnoNUMBER(3));/CREATETABLEordersOForder_type(FOREIGNKEY(gno)REFERENCESgoods(gno));对象引用例----customer----gnonumberorders----2张大年年----custgno----goodsOID=对象表—对象象引用REF是指向行对象象的指针,易易于实现表和和表之间的联联系,对象之之间连接不再再需要关系表表的连接(JOIN)操作。将对象表的表表别名作为REF的参数,可以以取得对应OID的引用值。引用只能用于于具有OID的对象。customerREF cust_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(city VARCHAR2(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_NAMELENGTH ATTR_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;EN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吊装作业防倾覆处置方案
- 敬老院老人一氧化碳中毒应急演练脚本
- 医疗器械采购培训试题及答案
- 2026年专业继续教育试题及答案
- (完整版)PE排水管道专项施工方案
- CBD项目临时办公区搭建施工方案
- 项目管理师考试真题及答案
- 安全生产应急演练实施责任制管理规定
- 中外历史纲要(下) 选择性必修1 第15单元 第42讲 第2课时 近代以来中国的官员选拔与管理
- 公安脱岗检讨书
- 山西省律师服务收费指引(试行)
- 采购红黑榜制度
- 2025年湖南省怀化市检察官、法官入员额考试真题(附答案)
- 2026澳门华人银行股份有限公司招聘笔试备考题库及答案解析
- 研发部内部资料管理制度
- 2026年《中国卫生健康统计年鉴》数据分析与报告
- 药品包装岗位培训
- 野战救护技术
- 2026年中小学生安全知识竞赛题库及答案(共133题)
- 消防训练安全事故防范与应对
- 输液反应应急预案培训大纲
评论
0/150
提交评论