版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 ( city VARCHAR2(10), street VARCHAR2(10), zip NUMBER(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_companyRETURNNUMBERIS BEGIN RETURNfloor(sysdate-hiredate); END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)IS BEGIN UPDATEemployeesSETsal=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_companyRETURNNUMBERIS BEGIN RETURNfloor(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中对象方法的调用DECLARE emp_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.enable
setserveroutputon对象方法小结对象类型总是有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),name name_type,address address_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(orderid NUMBER(3),customer REFcust_type,orderdate DATE,qty NUMBER(5),gno NUMBER(3));/CREATETABLEordersOForder_type(FOREIGNKEY(gno)REFERENCESgoods(gno));对象引用例----customer----gnonumberorders----2张大年----custgno----goodsOID=对象表—对象引用REF是指向行对象的指针,易于实现表和表之间的联系,对象之间连接不再需要关系表的连接(JOIN)操作。将对象表的表别名作为REF的参数,可以取得对应OID的引用值。引用只能用于具有OID的对象。customer REF cust_typeSCOPEISCUSTSCOPE子句用于限定一个引用在一个指定表中,这样可以提高查询性能,并减少存储指针的空间。INSERTINTOordersSELECT1,ref(c),‘7-1月-2000’,165,101
FROMcustc WHEREcustid=1;UPDATEorders SETcustomer=(SELECTREF(c)FROMcustc WHEREcustid=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_map RETURNvarchar2);在类型体中实现MAP方法:CREATETYPEBODYname_typeASMAPMEMBERFUNCTIONname_mapRETURNvarchar2ISBEGIN
RETURNfirst_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),zip NUMBER(6),ORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGER);在类型体中实现方法:CREATEORREPLACETYPEBODYaddress_typeASORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGERISBEGIN IFself.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
方法例2CREATEORREPLACE
TYPEemployee_typeASOBJECT(
empno NUMBER(3),ename VARCHAR2(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_companyRETURNNUMBERIS BEGIN RETURNfloor(sysdate-hiredate); END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)IS BEGIN UPDATEemployeesSETsal=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_type
REPLACEASOBJECT(empno NUMBER,ename VARCHAR2(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_NAME LENGTH ATTR_TYPE_NAME-------------------------------------------------------------------CITY 20 VARCHAR2STREET 30 VARCHAR2ZIP NUMBER对象类型信息查看类方法定义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_name
Rname,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_type ASVARRAY(5)OFVARCHAR2(10);建借阅者表的类型CREATETYPEborrower_typeASOBJECT( sno NUMBER(6), sname VARCHAR2(10), class VARCHAR2(10), books book_list_type, MEMBERFUNCTIONadd_book(bookVARCHAR2) RETURNbook_list_type, PRAGMArestrict_references(add_book,WNDS));在方法中处理数组类型数据实现类方法CREATETYPEBODYborrower_typeAS MEMBERFUNCTIONadd_book(bookvarchar2) RETURNbook_list_type IStemp_arraybook_list_type; counterINTEGER; BEGIN temp_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_bookRETURNnumberIS temp_arraybook_list_type;BEGIN temp_array:=SELF.books; RETURNtemp_array.limit-temp_array.count;END;查询可再借几本书selectb.bnum_book()fromborrowerbwheresno=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 被调岗换岗安全培训课件
- 腰椎椎管狭窄手术护理配合
- 中医气血课件
- 中医基础理论望诊方法
- 大型会议活动策划执行方案范本
- 安全标准化管理持续改进方案
- 老龄教育法律法规探讨-洞察及研究
- 基于大数据的个性化学习体验优化策略-洞察及研究
- 金融市场开放对汇率稳定与经济波动的影响-洞察及研究
- 2026届新高考化学冲刺复习“两大理论”与分子的空间结构
- 质量安全培训资料课件
- 2025年国家开放大学《应用写作》期末考试备考试题及答案解析
- GB/T 6509-2025聚己内酰胺(PA6)切片和纤维中己内酰胺及低聚物含量的测定
- 考卷烟厂笔试题目及答案
- 行吊操作安全培训内容课件
- 医院医疗设备可行性研究报告
- 不动产抵押登记讲解课件
- 2025秋季学期国开电大法律事务专科《刑事诉讼法学》期末纸质考试单项选择题库珍藏版
- DB37T 1914-2024 液氨存储与装卸作业安全技术规范
- 产品召回演练培训
- 2025年湖北省中考生物、地理合卷试卷真题(含答案)
评论
0/150
提交评论