Oracle8对象关系数据库

收藏

编号:212754533    类型:共享资源    大小:319.50KB    格式:PPT    上传时间:2023-05-23
10
积分
关 键 词:
Oracle8 对象 关系 数据库
资源描述:
Oracle8 Oracle8 对象关系数据库对象关系数据库一、高端数据库-提高DBMS管理上限oracle7oracle8数据库大小数据库大小32TB512KTB数据文件个数数据文件个数 1-4K64-256M每表包含列每表包含列数数2541000每表的每表的LOB列数列数1long1000CHAR长度长度2542000VARCHAR长度长度20004000索引列数索引列数1632n支持上万个并发用户=多线程服务器(用少量的服务器端进程管理大量的客户端用户。=Net8(SQL*net)连接管理器连接池(TNS资源)、多路传输、应用请求集中化更有效地使用网络资源避免操作系统对服务器网络连接数的限制客户端(服务器)服务器一、高端数据库-提高DBMS管理上限网络层透明网络底层 协议适配器二、扩充的类型系统 -对象关系数据库数据库新的应用领域n 计算机辅助设计 CAD数据库必须存储和处理与工程设计相关的数据(产品部件及相互关系、设计版本)n 计算机辅助软件工程 数据库中存储软件开发人员用到的各种数据,包括源代码、模块之间依赖关系、变量定义、文档n多媒体数据库 声音、视频、图象n办公信息系统n超文本数据库应用需要新的数据类型 论文检索系统n论文标题n作者列表(第一作者,第二作者,找出某人参与撰写的所有论文)n检索关键字n发表日期(年月日分开)传统关系数据库的数据类型传统关系数据库的数据类型n复杂属性只能拆分成并列的单一属性姓名,地址(省、市、区、街道、门牌号)本来是一个结合紧密的整体,在关系数据库中却只能拆成单一属性,与其他属性并列(如姓名、年龄等),没有反映出它们的紧密关系。n无法表示变长的属性家庭记录有几个孩子 =长字段=设几个字段(不好估计)家庭编号户主子女1子女2子女3传统关系数据库的数据类型传统关系数据库的数据类型n无法直接表示嵌套表n例:一张发货单,发三种货物:=放3条记录,但公共信息存3遍(查询方便)=拆成两张表(发货单,发送货物),需要连接,费时,且要清楚表与表的关系货单号 发货人货物日期发往地货物名称价格数量关系数据库的数据模型n数据模型是模型化数据和信息的工具。数据模型是模型化数据和信息的工具。现实世界现实世界认识认识抽象抽象信息世界概念数据模型机器世界DBMS支持的数据模型关系模型转换数据模型演变n文件系统(OS)n层次模型网状模型关系模型(DB)n特点:=面向记录,信息由定长记录组成。=记录简单(短小)。=原子字段,字段不再含有结构。关系模型的特点n强调数据的独立性(以数据为中心),数据与程序分离。n采用关系模型、概念单一,实体和联系都是用关系来表示。n关系必须是规范化的关系,要求每一分量不可再分。n支持关系语言,具有高度非过程化,支持集合运算n 通过外来码实现表的连接(多表查询)Oracle8扩充的类型系统n是对关系数据模型进行的扩充。n提供更为丰富的面向对象的类型系统。n扩充的类型系统允许元组的属性值为复杂类型,在关系查询语言中增加处理新数据类型的成分。=既保留关系模型基础=又提高建模能力n对象关系模型为希望使用面向对象特征的关系数据库用户提供可能。面向对象的基本概念n面向对象方法是以要解决的问题中所涉及到的各种对象为主要考虑因素。n对象是一种看问题的观点,是对现实世界各种元素的一种抽象。对象既含数据又含功能,因此具有自身处理数据的能力。对象被认为是迄今为止最接近真实事物的数据抽象。n现实世界中对象有两个共同的特点:=一方面,它们都有自己的状态。如一台电视机有自己的摆放位置,有关机和开机状态,此刻正在播放某一频道的电视节目等=另一方面,它们又都有自己的行为,如电视机的开机、关机、调台等。面向对象的基本概念 内部实现(封装)接口属性、方法能动的主体n使电脑贴近人脑的思维模式(减少人认识问题时的认识空间和计算机处理问题时的方法空间的不一致性)。n实现软件的复用(软件芯片)。对象的属性与方法n面向对象程序设计中的对象是现实世界对象的模型化,它同样具有状态和行为。=对象的状态用属性来维护,=对象的行为用方法来实现。n因此可以简单地讲,对象是面向对象的程序设计模式,它由描述对象状态的属性(变量)和用来实现对象行为的方法(代码)组成。对象与类n相关对象的集合称为 类(Class)n类是对象的抽象及描述,它是具有统一属性和方法的多个对象的统一描述体,是用来定义一组对象共有属性和方法的模板。n类是用来创建对象实例的样板,它包含所创建对象的状态描述和方法的定义。类是一个型,而对象则是这个型的一个实例。n类是静态概念,而对象则是一个动态概念,因为只有在运行时才给对象分配空间,对象才真正存在。面向对象的数据模型n在一些应用中,用户将数据库中的数据看作是一组对象而非一组记录。n面向对象的数据模型是面向对象程序设计思想在数据库系统中的应用。n基本思想将数据和操作这些数据的程序代码封装在一个对象里。n将一个对象存储在数据库中:=对象的数据部分必须针对各个对象分别存储。=而实现类方法的程序代码应该和类的定义一起作为数据库模式的一部分存储。面向对象数据库n数据库中不是只存储单纯的数据,而是存储包含属性和方法的对象。n对于一个数据库对象,可定义在其上运行的过程和函数。使数据库中的数据和访问该数据的方法联系起来,可标准化数据访问的方法并提高对象的可复用性。n应用逻辑从应用程序中移动到数据库中(对象方法)n创建通用的数据库对象,并能成为数据库对象的标准,可实现数据库对象的重用。数据模型现实世界现实世界认识认识抽象抽象信息世界概念数据模型机器世界DBMS支持的数据模型对象模型转换对象模型与关系模型n对象模型n对象类型的属性描述n对象类型的方法封装了操作该对象的代码。提供了处理数据库中数据的界面。n关系模型n二维表中列的定义n没有方法=另编程=可使用操作某数据库表的存储过程。n面向对象数据模型中的类概念实体集概念。n面向对象数据模型中的对象概念实体概念对象模型与关系模型n关系模型可用二维表来表示 关系表:=属性 二维表的列=元组 二维表的行n对象模型可用二维表来表示 对象表:=用一个 类(对象类型)定义一个对象表=类的属性 二维表的列=对象(类的实例)二维表的行(行对象)=通过对象调用对象方法。Oracle的扩充类型nOracle是一个开放的类型系统,增加了复杂的数据类型以及用户自定义类型n用户定义的数据类型使得可以在数据库中为现实世界的对象建模=对象类型(记录类型)=数组类型=嵌套表类型n创建对象表,实现面向对象的数据库设计(而非关系型数据库设计。=应用逻辑从应用程序中移动到数据库中(对象方法)扩充类型的不同应用对象类型数组类型嵌套表类型关系表对象表对象类型利用对象类型定义复合数据类型用户自定义数据类型n使用对象类型定义一个记录数据类型 CREATE TYPE name_type AS OBJECT(first_nameVARCHAR2(4),last_nameVARCHAR2(4);CREATE TYPE address_type AS OBJECT(city VARCHAR2(10),street VARCHAR2(10),zip NUMBER(6);CREATE TABLE worker (wid NUMBER(5)PRIMARY KEY,wname name_type,address address_type );对象类型数据的操作n 使用对象类型声明了关系表中的列,DML语句必须用一些特殊的语法n插入新记录时,对于对象类型的列,要使用构造函数构造出对应类型的数据。n构造函数是对象类型的特殊方法,利用此方法为该类型创建对象。构造方法的名称与对象类型(类)同名。n对记录型数据的分量进行操作时,要使用“别名”对象类型数据的操作n插入语句例:insert into workervalues(1,name_type(王,至远),address_type(北京,白颐路5号,100084);insert into workervalues(2,name_type(张,大年),address_type(天津,康宁里20号,300072);insert into workervalues(3,name_type(赵,力平),address_type(上海,南京路23号,200092);对象类型数据的查询n查询语句1select*from worker;WID NAME(FIRST_NAME,LAST_NAME)ADDRESS(CITY,STREET,ZIP)-1 NAME_TYPE(王,至远)ADDRESS_TYPE(北京,白颐路5号,100084)2 NAME_TYPE(张,大年)ADDRESS_TYPE(天津,康宁里20号,300072)3 NAME_TYPE(赵,力平)ADDRESS_TYPE(上海,南京路23号,200092)n查询语句2select wid,wname from worker;WID NAME(FIRST_NAME,LAST_NAME)-1 NAME_TYPE(王,至远)2 NAME_TYPE(张,大年)3 NAME_TYPE(赵,力平)对象类型数据的查询n查询语句3 (用别名)select wid 顾客编号,w.address.city 城市,w.address.street 街道,w.address.zip 邮编from worker w;顾客编号 城市 街道 邮编 -1 北京 白颐路5号 100084 2 天津 康宁里20号 300072 3 上海 南京路23号 200092n查询语句4(别名的使用)select*from worker w order by w.address.zip 对象类型数据的操作n修改update worker wset w.address.zip=100083where wid=1;n删除delete from workerwhere wid=1;delete from worker wwhere w.name.first_name=王 ;n修改表结构alter table cust add(address1 address_type);n不能对表修改自定义的数据类型格式用户自定义数据类型n对象类型更加贴近现实世界的数据特征。n使用对象类型可以更加统一、自然地声明和操作表中的数据(在整个数据库中地址一致性)n创建可为大家引用的新数据类型:=创建一个模式(如 pub)=建立公共对象类型(新数据类型)=设置必要的权限n使用 CREATE PROCEDURE new_worker(wid NUMBER,name pub.name_type,address pub.address_type)自定义数据类型上的索引create index aaa on worker(wname);ORA-02327:无法在具有数据类型 ADT 的列上创建索引。(即使在name_type类中定义了排序方法也不可以)n如经常进行如下查询:select wid 顾客编号,w.address.city 城市,w.address.street 街道,w.address.zip 邮编from worker wwhere w.address.zip=100084;n可建索引如下:create index I_zip on worker(address.zip);使用对象表面向对象数据库设计建立对象表的类n 建类型(对象类型声明)create type 类型名 as object(属性名1 类型说明,属性名2 类型说明,.member function 函数名(参数说明)return 返回类型,member procedure 过程名(参数说明),);方法说明属性说明对象属性类型n对象类型必须包含一个或多个属性,属性的类型可以是:=Oracle的原始数据类型、=LOB=对象=对象的引用(REF)=收集(COLLECTION)等对象方法n方法是一个过程或函数,是对象类型定义的一部分,是程序员编写的用于操纵对象属性的子程序,被封装在对象类型中。n方法的种类:=成员方法(member)=构造方法(constructor)=MAP 或 ORDER 方法(排序方法)n一个类可以有多个方法(也可以不定义方法)n对象类型不存储数据;必须创建相应的表来存储数据编写方法代码n建类型体(实现类成员方法)create type body 类型名 ASmember function 函数方法名(参数说明)return 返回类型is 说明部分begin 执行部分end;member procedure 过程方法名(参数说明)is 说明部分begin 执行部分end;END;方法实现方法实现建立对象表n建对象表 Create table 表名 of 对象类型();n例:CREATE TYPE employee_type AS OBJECT(.);CREATE TABLE employees OF employee_type (empno constraint e1 primary key);CREATE TYPE BODY employee_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(sal300);建立对象类型体CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)ISBEGINUPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno;END;END;对方法的限制n编译软件包中的函数或过程时,可以使用PRAGMA编译指令通知PL/SQL编译器禁止某方法对数据库表和包中的变量读写,当方法体中出现违反情况时,编译出错。n格式:PRAGMA RESTRICT_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),PRAGMA RESTRICT_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违反了它的相关编译指令对象类型-构造子方法nOracle 自动地为每个对象类型创建一个构造方法。n构造子方法的名称采用对象类型名。n构造子方法的参数即对象类型的所有属性。n构造子方法初始化一个对象类型的实例,并将它的属性赋值。n例:insert into employees values(employee_type(1,Jone,500,5-10月-1989);对象表操作n建表 create table employees of employee_type;n插入数据insert into employees values(employee_type(1,Jone,500,5-10月-1989);insert into employees -省略构造方法values(1,Jone,1500,5-10月-1989);insert into employees values(2,smith,700,10-5月-1997);insert into employees values(3,king,900,25-12月-2000);获取行对象value函数nvalue(对象表别名)返回一个行对象(对象类型)nvalue用于从对象表中取得对象实例。n 不使用value,SELECT只能返回一个对象的各个列值。select*from employees;EMPNO ENAME SAL HIREDATE-1 Jone 1500 05-10月-89 2 smith 700 10-5月-97 3 king 900 25-12月-00select value(e)from employees e;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)对象表方法调用select ename,hiredate from employees where empno=1 ;EMPNAME HIREDATE-Jone 05-10月-89select ename,e.days_at_company()daysfrom employees e where empno=3;EMPNAME DAYS-king 45使用别名n在PL/SQL程序中,取得的对象实例必须被相同类型的对象变量接收。n例:declare emp employee_type;begin select value(e)into emp from employees e where empno=1;emp.raise_salary(500);end;/PL/SQL中对象方法的调用PL/SQL中对象方法的调用DECLAREemp_variableemployee_type;days_employednumber;BEGINSELECT VALUE(e)INTO emp_variableFROM employees eWHERE e.empno=3;days_employed:=emp_variable.days_at_company();dbms_output.put_line(Days employed:|to_char(days_employed);END;/附:PL/SQL输出与环境设置n执行结果:Days employed:26nPL/SQL输出(利用包过程)=dbms_output.put_line();n环境设置=exec dbms_output.enable=set serveroutput on对象方法小结n对象类型总是有1到多个方法(构造方法是隐含方法,成员方法为0n个。n成员方法可以带输入输出参数。n每个成员方法含有名为SELF的隐含第一参数,它具有与对象类型自身相同的类型。n定义函数方法,如没参数不用写括号,但调用时要写括号。定义方法形参时,类型不用写长度,如varchar2对象表的特性n对象表是只用对象类型定义的数据库表,不含关系型列。n对象表的列对应(用来创建表的)对象类型的属性。n对象表的行是表类型的对象(实例),每一行都有一个系统分配的唯一的对象标识符(OID)=对象ID(OID)是每一个行对象的唯一描述符,是全局唯一的,并且可以引用=OID不用于定位数据,ROWID仍用于定位数据noracle 通过对象引用实现数据库中不同对象之间的联系(与关系表完全不同)获取对象引用ref函数n具有OID的对象实例可以被引用(REF)nref(对象表的别名)返回对象表实例指针,即行对象的引用。n例:select ref(e)from employees e;REF(e)-000028020965D.0BEFE0340800209ADC5901403BE50000000028020965D.0BEFE0340800209ADC5901403BE50001000028020965D.0BEFE0340800209ADC5901403BE50002对象引用例n建立对象表custCreate type cust_type as object(custidnumber(5),namename_type,address address_type );create table cust of cust_type(custid primary key);对象引用例n向cust表中插入数据insert into custvalues(1,name_type(王,至远),address_type(北京,白颐路5号,100084);insert into custvalues(2,name_type(张,大年),address_type(天津,康宁里20号,300072);insert into custvalues(3,name_type(赵,力平),address_type(上海,南京路23号,200092);对象引用例n查询cust表select*from cust where custid=1;select c.address.city,c.address.zip from cust cwhere c.name.first_name=王;n修改cust 表结构?alter table custadd(address1 address_type);不允许!对象引用例n建立goods_typeCREATE TYPE goods_type AS OBJECT(gno NUMBER(3),gname varchar2(20),price number(6,2);/CREATE TABLE goods OF goods_type(constraint p1 primary key(gno);INSERT INTO goods VALUES(101,电视机,2900);INSERT INTO goods VALUES(102,洗衣机,1500);对象引用例CREATE TYPE order_type AS OBJECT(orderid NUMBER(3),customer REF cust_type,orderdate DATE,qtyNUMBER(5),gnoNUMBER(3);/CREATE TABLE orders OF order_type(FOREIGN KEY(gno)REFERENCES goods(gno);对象引用例-customer-gnonumberorders-2张大年-custgno-goodsOID=对象表对象引用nREF是指向行对象的指针,易于实现表和表之间的联系,对象之间连接不再需要关系表的连接(JOIN)操作。n将对象表的表别名作为REF的参数,可以取得对应OID的引用值。n引用只能用于具有OID的对象。ncustomer REF cust_type SCOPE IS CUST SCOPE子句用于限定一个引用在一个指定表中,这样可以提高查询性能,并减少存储指针的空间。INSERT INTO orders SELECT 1,ref(c),7-1月-2000,165,101 FROM cust c WHERE custid=1;UPDATE orders SET customer=(SELECT REF(c)FROM cust c WHERE custid=2)WHERE orderid=1;引用类型数据的操作引用类型数据的操作引用类型数据的操作引用类型数据的操作SELECT customerFROM orders WHERE orderid=1;22020865F009D0AC26242A35E0340800SELECT o.customer.custid 顾客号,o.customer.name.last_name 名,orderdate 日期FROM orders oWHERE orderid=1 顾客号 名 日期-2 大年 07-1月-00对象引用简化了代码n数据库管理对象间的连系,用户只需通过属性进行对象的引用。n在关系设计中,开发人员必须使用联接(JOIN)SELECT name,address,.FROM orders o,cust cWHERE o.custid=c.custid and orderid=1;deref函数nderef(ref指针)返回指针指向的对象本身n例:select deref(customer)from orders where orderid=1;DEREF(CUSTOMER)(CUSTID,NAME(FIRST_NAME,LAST_NAME),ADDRESS(CITY,STREET,ZIP)-CUST_TYPE(2,NAME_TYPE(张,大年),ADDRESS_TYPE(天津,康宁里20号,300072)n试比较:select deref(ref(c)from cust cwhere custid=2;和select value(c)from cust cwhere custid=2;SQL语句中的排序和比较n传统的数据类型主要为标量数据类型:=number,char,daten标量数据类型可以排序(如order by)n排序在SQL语句的使用:=关系运算(标量类型=方法返回一个传统数据类型用于排序。=没有输入参数(只有一个隐含参数SELF)。=方法被隐含调用。n在类型定义中说明MAP方法:CREATE TYPE name_type AS OBJECT(first_name varchar2(4),last_name varchar2(4),MAP MEMBER FUNCTION name_mapRETURN varchar2);n在类型体中实现MAP方法:CREATE TYPE BODY name_type AS MAP MEMBER FUNCTION name_map RETURN varchar2 IS BEGIN RETURN first_name|last_name;END;END;n排序:SELECT custid,c.address.city FROM cust c ORDER BY name desc ;任何基于name_type类型的排序按名称的拼接串作为大小比较的依据。MAP方法例MAP方法隐含调用ORDER方法n决定类型实例的序列关系。n有一个参数(外加一个隐含的参数SELF)n函数方法返回一个整数=如果对象自身比参数对象小,返回-1=如果对象自身与参数对象相等,返回 0=如果对象自身比参数对象大,返回 1ORDER方法例1n在类型定义中声明order方法:CREATE or replace TYPE address_type AS OBJECT(city VARCHAR2(10),street VARCHAR2(10),zip NUMBER(6),ORDER MEMBER FUNCTION address_order(other_address address_type)RETURN INTEGER );n在类型体中实现方法:CREATE OR REPLACE TYPE BODY address_type AS ORDER MEMBER FUNCTION address_order(other_address address_type)RETURN INTEGER IS BEGIN IF self.zip other_address.zip THEN RETURN-1;ELSE RETURN 0;END IF;END;END;ORDER方法例1邮编数小的地址大ORDER方法例1n排序:select c.name.first_name 姓,c.name.last_name 名,c.address.city 城市,c.address.zip 邮编from cust corder by c.address desc;n排序结果:姓 名 城市 邮编-王 至远 北京 100084赵 力平 上海 200092张 大民 天津 300072ORDER方法例2CREATE OR REPLACE TYPE employee_type AS OBJECT(empnoNUMBER(3),enameVARCHAR2(10),salNUMBER(6.2),hiredateDATE,MEMBER FUNCTION days_at_company RETURN NUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMA RESTRICT_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对象类型维护ALTER TYPE employee_type REPLACE AS OBJECT(empno NUMBER,ename VARCHAR2(10),sal NUMBER,hiredate DATE,MEMBER FUNCTION days_at_company RETURN NUMBER,MEMBER PROCEDURE raise_salary(increment_sal NUMBER),PRAGMA RESTRICT_REFERENCES(days_at_company,wnds,wnps),对象类型维护ORDER MEMBER FUNCTION emp_order(other_emp employee_type)RETURN INTEGER,MEMBER FUNCTION month_at_company -新方法 RETURN NUMBER,PRAGMA RESTRICT_REFERENCES(month_at_company,wnds);/对象类型维护CREATE OR REPLACE TYPE BODY employee_type AS MEMBER FUNCTION days_at_company RETURN NUMBER IS BEGIN RETURN floor(sysdate-hiredate);END;MEMBER PROCEDURE raise_salary(increment_sal NUMBER)IS BEGIN UPDATE employees SET sal=sal+increment_sal WHERE empno=SELF.empno;END;对象类型维护ORDER MEMBER FUNCTION emp_order(other_emp employee_type)RETURN INTEGER IS BEGIN RETURN FLOOR(-(SELF.hiredate other_emp.hiredate);END;MEMBER FUNCTION month_at_company RETURN NUMBER IS BEGIN RETURN months_between(sysdate,hiredate);END;END;/对象类型信息与类型有关的数据字典视图nuser_types=type_name attributes methods nuser_type_attrs=type_name attr_name length attr_type_name nuser_type_methods=type_name method_name 对象类型信息n查看对象类型select type_name,attributes,methodsfrom user_types;TYPE_NAME ATTRIBUTES METHODS-ADDRESS_TYPE 3 1EMPLOYEE_TYPE 3 1NAME_TYPE 2 0ncolumn type_name format a20 wrapncolumn attributes format 999 wrap ncolumn methods format 999 wrap对象类型信息n查看类属性定义select attr_name,length,attr_type_namefrom user_type_attrswhere type_name=ADDRESS_TYPE;ATTR_NAMELENGTHATTR_TYPE_NAME-CITY20VARCHAR2STREET 30VARCHAR2ZIPNUMBER对象类型信息n查看类方法定义select type_name,method_name from user_type_methods;TYPE_NAME METHOD_NAME-ADDRESS_TYPE ADDRESS_ORDEREMPLOYEE_TYPE DAYS_AT_COMPANYEMPLOYEE_TYPE MONTH_AT_COMPANYEMPLOYEE_TYPE EMP_ORDERNAME_TYPE NAME_MAP对象类型相关性n在对象和对象类型之间存在相关树。必须保证树的完整。不允许破坏被引用的类型。n例如:drop type name_type;当类型已被引用时不让删drop type name_type force;强行删除,再查使用该类型定义的表时出错。name_typeaddress_type对象类型相关性cust_typeemployee_typegoods_typeorder_type查看对象相关性n例:select name,type,referenced_name Rname,referenced_type Rtype from user_dependencies where name=ORDERS;NAMETYPERNAMERTYPE-ORDERSTABLESTANDARDPACKAGEORDERSTABLECUST_TYPETYPEORDERSTABLEORDER_TYPETYPE查看对象相关性n例:select.name=CUSTname type Rname Rtype -CUST TABLE STANDARD PACKAGECUST TABLE NAME_TYPE TYPECUST TABLE ADDRESS_TYPE TYPECUST TABLE CUST_TYPE TYPEn例:select referenced_name=cust_type;查看哪些对象使用了cust_type类型。查看对象相关性n例:select.name=CUST_TYPE;name type Rname Rtype -CUST_TYPE TYPE STANDARD PACKAGECUST_TYPE TYPE NAME_TYPE TYPECUST_TYPE TYPE ADDRESS_TYPE TYPEn列出依赖树:=执行oracle根目录/rdbms/admin/utldtree.sql=生成两个视图deptree 和ideptree=程序视图显示依赖树。小结对象属性和方法n当使用表的当前行对象时,对象属性和方法的引用必须使用表的别名,而不能是实际的表名nselect c.address.city,c.address.zip from cust c where c.name.first_name=王;nselect e.days_at_company()from employees e where e.empno=3;小结列对象与行对象n列对象:嵌入型对象,作为表中的列来处理的对象,要通过主表才能访问。=自定义复合数据类型=可变数组=嵌套表n行对象:不是嵌入型对象,而是引用型对象,可以通过其他对象的引用(ref)来访问。n列对象没有OID,而且不能被引用。n列对象是基于对数据库已有功能的扩充(自定义类型)。收集类型Oracle的数据类型扩展收集类型n实现一对多关系的模型化。n在关系设计中,只能通过联接(JOIN)实现表的关联,将导致复杂的运算。n在对象设计中,可以通过收集实现对象类型的关联收集类型记录数组表收集类型-可变数组n支持有序的一对多的关系。n可以在一行中存储某个记录的重复属性。n可变,但要指定数组最大容量。n数组元素具有相同类型,可以是 基本类型、REF或对象类型。但不能是嵌套表或可变数组类型。n不能是VARRAY OF LOB类型book数据结构分析化学相关图Book_list_type(varray(5)ofvarchar2(10)borrower_type(sno,sname,class,books)borrower使用数组类型n定义数组类型CREATE TYPE book_list_typeAS VARRAY(5)OF VARCHAR2(10);n建借阅者表的类型CREATE TYPE borrower_type AS OBJECT(sno NUMBER(6),snameVARCHAR2(10),class VARCHAR2(10),booksbook_list_type,MEMBER FUNCTION add_book(book VARCHAR2)RETURN book_list_type,PRAGMA restrict_references(add_book,WNDS);在方法中处理数组类型数据n实现类方法CREATE TYPE BODY borrower_type ASMEMBER FUNCTION add_book(book varchar2)RETURN book_list_type IS temp_array book_list_type;counter INTEGER;BEGINtemp_array:=SELF.books;counter:=temp_array.COUNT+1;temp_array.EXTEND;temp_array(counter):=book;RETURN temp_array;END;END;n建含有数组的对象表CREATE TABLE borrower OF borrower_type;收集类型收集类型-收集的方法收集的方法n收集(collection)的方法:内置的函数和过程 n函数方法:=EXISTS(n)当收集类型中指定元素存在为“真”=COUNT 返回当前收集类型中的元素个数。=LIMIT 返回可变数组元素个数的上限值=FIRST and LAST 返回收集中第一个和最后一个元素的下标。(对于可变数组,总是返回1和count)=PRIOR(n)and NEXT(n)返回指定元素的前一个和后一个元素的下标。收集类型收集类型-收集的方法收集的方法n过程方法:=EXTEND 扩充收集的大小 extend 扩充一个空元素 extend(n)扩充n个空元素 extend(n,I)将收集中第I个元素拷贝n份,追加到收集中。=TRIM 从收集尾部删除元素 trim 删除收集中最后一个元素 trim(n)删除收集中最后n个元素=DELETE 删除元素 delete 删除收集中所有元素 delete(n)删除收集中第n个元素 delete(m,n)删除收集中第 mn 个元素收集类型-可变数组n插入数据INSERT INTO borrower VALUES (980001,李星,力01,book_list_type(数据结构,大学物理);INSERT INTO borrower VALUES(970025,王辰,化91,book_list_type(计算方法,分析化学);n修改数据(增加一本书)UPDATE borrower b SET b.books=b.add_book(物理习题集)WHERE b.sno=980001;包含可变数组列的查询n查询:select sname,books from borrower;SNAME BOOKS-李星 BOOK_LIST_TYPE(数据结构,物理习题集)王辰 BOOK_LIST_TYPE(计算方法,分析化学)n查数组元素?select b.sname,b.class,b.books(2)from borrower b错误位于第1行:*ORA-00904:非法的列名可变数组的操作n对数组元素的检索不能简单地用select 语句,而应在PL/SQL里用有关方法和循环结构查询。declare cursor c1 is select *from borrower;begin for r in c1 loop dbms_output.put_line(borrower name|r.sname);for i in 1.r.books.count loop dbms_output.put_line(r.books(i);end loop;end loop;end;收集类型方法例n在方法中直接修改数据库MEMBER PROCEDURE del_book(book varchar2)IS old_books book_list_type;new_books book_list_type;i integer:=1;j integer;BEGIN old_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;收集类型方法例n还能借几本MEMBER FUNCTION bnum_book RETURN number IStemp_array book_list_type;BEGINtemp_array:=SELF.books;RETURN temp_array.limit-temp_array.count;END;n查询可再借几本书select b.bnum_book()from borrower b where sno=980001;-3收集类型方法例 MEMBER PROCEDURE clear_book IS BEGINSELF.books.delete;UPDATE borrower SET books=SELF.books WHERE sno=SELF.sno;END;收集类型-嵌套表n嵌套表是包含在其它表(主表)中的表。n嵌套表中的列类型:基本类型或对象类型。n嵌套表在主表中作为列值。n对嵌套表的操作,首先要定位它主表中某个记录的嵌套表列的值。n物理上嵌套表与主表分开存放,用另外一个表存储主表的一个嵌套表列。该表的存储参数可以单独设置对象相关性Book_tBook_nt_tBook_array_t收集类型-嵌套表n建立数据类型,该类型将作为嵌套表的结构类型CREATE TYPE book_t AS OBJECT(bno char(4),bname VARCHAR2(10),rdate date );n建立嵌套表类型,CREATE TYPE book_nt_t AS TABLE OF book_t ;n建立包含嵌套表列的主表类型CREATE TABLE reader (rno number(6),rnamevarchar2(10),books book_nt_t )NESTED TABLE books STORE AS books_nt_tab;对存储表不可直接使用DML语句,但可改变存储属性。Altertablebooks_nt_tab.向嵌套表列插入数据insert into reader values(980001,赵船,book_nt_t(book_t(h101,化工原理,01-6月-00),book_t(w101,物理实验,01-7月-00),book_t(s101,线性代数,15-6月-00);insert into reader values(980002,李凡,book_nt_t(book_t(h102,分析化学,21-6月-00),book_t(w102,理论物理,11-7月-00),book_t(s102,组合数学,25-6月-00);insert into reader values(980003,张旬,book_nt_t(book_t(h103,化学实验,01-7月-00),book_t(w303,材料力学,01-7月-00),book_t(s103,计算方法,10-6月-00);对指定嵌套表查询n函数THE使得主表的“嵌套表列”展开为表,然后可以象一般表那样操作嵌套表。n要分清是对主表和对嵌套表操作。n查询select*from THE(select books from reader where rno=980001)where rdate 30-6月-00);BNO BNAME RDATE-h101 化工原理 01-6月-00s101 线性代数 15-6月-00对包含嵌套表列的表的查询select rno,rname,cur
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  装配图网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:Oracle8对象关系数据库
链接地址:https://www.zhuangpeitu.com/article/212754533.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!