




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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顾客编号,w.address.city城市,w.address.street街道,w.address.zip邮编fromworkerw;顾客编号城城市街街道道邮邮编-------------------------------------------------1北北京京白白颐路5号1000842天天津津康康宁里20号3000723上上海海南南京路23号200092查询语句4(别名的的使用)select*fromworkerworderbyw.address.zip对象类型数数据的操作作修改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顾客编号,w.address.city城市,w.address.street街道,w.address.zip邮编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_variableemployee_type;days_employednumber;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(custidnumber(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;selectc.address.city,.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的对象。。customerREF cust_typeSCOPEISCUSTSCOPE子句用于于限定一一个引用用在一个个指定表表中,这这样可以以提高查查询性能能,并减减少存储储指针的的空间。。INSERTINTOordersSELECT1,ref(c),‘‘7-1月-2000’’,165,101FROMcustcWHEREcustid=1;UPDATEordersSETcustomer=(SELECTREF(c)FROMcustcWHEREcustid=2)WHEREorderid=1;引用类型型数据的的操作引用类型型数据的的操作SELECTcustomerFROMordersWHEREorderid=1;22020865F009D0AC262…42A35E0340800…SELECTo.customer.custid顾客号,.last_name名,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;排序:SELECTcustid,c.address.cityFROMcustcORDERBYnamedesc;任何基于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排序:.first_name姓,.last_name名,c.address.city城市,c.address.zip邮编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-------------------------------------------------------------------CITY20VARCHAR2STREET 30 VARCHAR2ZIPNUMBER对象类型信息息查看类方法定定义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程序视图显显示依赖树树。小结—对象象属性和方方法当使用表的的当前行对对象时,对对象属性和和方法的引引用必须使使用表的别别名,而不不能是实际际的表名selectc.address.city,.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),sname VARCHAR2(10),class VARCHAR2(10),books book_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);foriin1..r.books.countloopdbms_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_ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品安全与卫生管理要点
- 语言康复治疗
- 生物消泡剂高效配方行业跨境出海项目商业计划书
- 高精度电子牌局计时行业跨境出海项目商业计划书
- 高耐久性建筑外墙漆颜料企业制定与实施新质生产力项目商业计划书
- 预防大肠癌的健康教育
- 高效能电源稳压器企业制定与实施新质生产力项目商业计划书
- 新生儿水肿的评估与护理
- 浮选尾矿与reclaimreclaim联合处理技术研究-洞察阐释
- 草地植物对土壤改良作用-洞察阐释
- 全国国道大全(包括里程及路过城市)
- 化学品作业场所安全警示标志大全
- T-QGCML 3384-2024 无人值守地磅收验货系统配置规范
- AQ/T 2061-2018 金属非金属地下矿山防治水安全技术规范(正式版)
- 道路提升改造、公路工程 投标方案(技术标)
- 《筵席设计与制作》考试复习题库(含答案)
- DZ/T 0462.6-2023 矿产资源“三率”指标要求 第6部分:石墨等26种非金属矿产(正式版)
- 交通出行车费报销单模板
- 中国民族钢琴艺术鉴赏智慧树知到期末考试答案章节答案2024年西安交通大学
- 咖啡文化与饮品调制智慧树知到期末考试答案2024年
- (高清版)DZT 0319-2018 冶金行业绿色矿山建设规范
评论
0/150
提交评论