编辑: 枪械砖家 | 2016-09-20 |
8 中产生 OID是Oracle公司的一个秘密,但是唯一性好像是以某种方式被链接到 CD_ROM介质上.对那些熟悉本地网络的以太网的人来说, OID应该是唯一的,就像以太网 卡的以太地址一样,在工厂中被固化. ID在它自身系统之外也是唯一的概念,与关系模型中 118计计第三部分计Oracle 8.x RDBMS 下载 的主键和代理键这些东西是不同的.然而,它在某种程度上像一个分布式数据库中的主键, 它们必须在多个系统中是唯一的. 你希望Oracle 8或任何ORDBMS中有的东西是什么?你可能希望一些东西, 如组合(集成) 多个关系表的对象视图.除了你已经包括的定制的(用户定义)数据外,你可能希望有一些 预创建的、综合的、业务的数据类型可以服务于特定的适当范围的需要.客户端对象缓存也 可能是需要的,因为它可以提供性能和访问的灵活性.你也不想失去 RDBMS的强项:一致性、 并发性和安全性. 12.3 Oracle 8对象选项 那么,通过面向对象技术, Oracle 8给了你什么?Oracle在如下方面扩展它已有的复杂的 多用途的RDBMS如下所示: 对象类型―本质上是记录或类. 对象视图―把你的许多规范化的表放在一起形成一个项目. 对象语言―对Oracle SQL和PL/SQL语言的扩展. 对象API―通过Oracle预编译器(例如Pro*C)支持的对象. 对象可移植性―通过对象类型翻译器(OTT) ,它可以建立Oracle 8对象类型到C++ 类的接口这样的东西. 但是,即使有了这些进步,Oracle
8 不支持多继承、多态性或在对象属性(如引用一致性) 上的约束. Oracle 8开放式类型系统( OTS)是一个所有Oracle 8对象类型的知识库,也是其他语言 或系统中的外部对象类型的知识库.在开放式类型系统中,有一个数据类型层次,作为它的 底层的是内建的Oracle 8数据类型.Oracle 8还增加了大对象(参考第 11章 大对象的历史 ) , 形式是BLOB、CLOB、NCLOB和BFILE,还增加了VARRAY(变量数组)和嵌套表形式的集 合类型和REF(引用)形式的对象 ID.另外,用户定义数据类型能够被创建在任何内建的数 据类型和已有的用户定义数据类型上,唯一的例外是它们不能被创建在 LONG、LONG RAW、 ROWID或%TYPE上.当你在Oracle 8中创建用户定义的对象类型后,可以将它用于多种用途, 包括: 作为关系型表中的一列. 作为另一个对象类型的一个属性. 作为关系型表的对象视图的一部分. 作为对象表的基础. 作为PL/SQL变量的基础. 用于管理对象类型的扩展 Oracle SQL,包括以下这些: CREATE TYPE ALTER TYPE DROP TYPE GRANT/REVOKE TYPE 和表的列一样,属性在一个对象类型中必须唯一,但是在其他对象类型中该属性名可以 被再用.与表中的列一样,你总能在一个对象中通过它的名字访问其属性.没有能力进行位 第12章计面向对象的特性计计119 下载 120计计第三部分计Oracle 8.x RDBMS 置或偏移量访问.任何给定的对象类型可以是简单的、复合的或者自我引用的.简单对象类 型就只是它自身;
复合对象类型至少包括一个其他对象类型;
自我引用对象类型至少包含一 个引用对象类型自身的属性.清单 12-1和清单12-2给出了两个创建和使用对象类型的例子. 清单12-1 创建一个雇员对象类型 清单12-2 使用一个对象类型作为关系型表中的一列 注意你必须使用一个别名和点符号来查询一个表中的对象属性值.同时还要注意当你进 行插入时,为命名为employee_type的对象类型调用命名为 emlpoy_type的构造器方法.所有的 构造器具有与它们相关的对象类型相同的名字.清单 12-3给出了另外一个使用对象类型的例 子,这次是创建一个对象表. 清单12-3 创建一个对象表 创建这个表也为一个对象实例(行)创建一个包含对象ID(OID或REF)的列.这与创建一 个关系型表,这个表在一个列中具有一个对象类型形成对照.在关系表中的对象类型没有OID. 12.4 REF属性 在Oracle 8对象世界中的关系与在 Oracle关系世界中的关系实际没有什么不同:它指明对 象之间如何相关. Oracle8仅支持一对一单向的关系,它可能足够也可能不够将你的业务模型 化.当你声明一个对象类型中的属性是 REF时,它代表对其他一些对象类型的引用,这是一 个最基本的关系. REF代表了一个对象的关系.一个 REF本质上是一个指针,或一个对象的 句柄 .你可以限制一个REF实际指引的范围,在SQL 3中包括范围的概念.SQL 3是对ANSI SQL标准的最新版本,它包含一些面向对象的特性. 像RMT(关系型模型2)中的代理键一样, Oracle 8中的对象引用( REF)是一个系统产 生的值,在所有对象中(任何地方)是唯一的,指向一些永久不变的对象.一个 REF实际上 引用一个对象―对象表中的一行(实例) ,而不是真正的对象类型.一个给定对象的 REF是 下载 对象的OID+对象的表ID+对象表的数据库 ID的组合.清单 12-4显示如何创建一个包含引用已 创建的employce_type的REF属性的对象类型,并创建基于这一个对象类型的对象表,再插入 一行(实例化一个对象) . 清单12-4 12.5 方法 一个对象类型可以有零个或多个成员方法.一个成员方法是一个能够操作任何对象类型 (不仅仅是定义它的那个类型)的数据(也就是属性)的子程序.当然,方法简单说就是 PL/SQL过程或函数. 正像使用任何PL/SQL封装的子程序一样,应为每一个方法创建一个接口(声明)和一个 实现(体) .当访问一个方法时,应使用点表示法(对象 .方法) .清单12-5给出在一个对象类 型内创建方法(声明和体)的例子,跟随其后的是调用该方法的一些 PL/SQL代码. 清单12-5 第12章计面向对象的特性计计121 下载 注意函数使用pragma指令设置为WNPS.WNPS代表 写无包状态 ,它的意思是函数被 设置为不能修改自身内的任何参数(否则产生负面影响) .为了比较或排序对象类型,你能定 义一个MAP或一个ORDED函数来比较两个对象.当使用这些比较函数时,你指定了对象分类 语法(也就是,一个整理的序列) ,用于条件和分类.请参考 Oracle 8或Oracle 8i CD-ROM文 献以获得更详细的实现信息. 12.6 集合―变量数组和嵌套表 集合是排序的或未排序的一组事物,变量数组是排序的,而嵌套表是未排序的.嵌套表 是在最新的ANSI标准中,但变量数组是非标准的.任何主从(也就是一对多)关系能帮助对 比这两种类型的集合.用某种顺序列出的主表项目能够使用变量数组( VARRAY) ,对每一个 主表行的每行项目细节可以在变量数组中使用嵌套表. 警告 并行查询、并行DML、复制和分布数据库函数都不支持集合. 和许多数组一样,Oracle 8变量数组有一个隐式的顺序.每一个元素在数组中有一个从数 组起始位置开始的偏移量,能够通过偏移量直接进行访问(也就是所谓的下标或索引) .变量 数组是按行存储的(在表的行中) ,直到存储........