首页 百科知识 定义对象类型

定义对象类型

时间:2022-10-09 百科知识 版权反馈
【摘要】:对象类型是按数据字典对象创建的。每个对象均具有一个构造函数,该函数由系统定义,其名称与对象类型同名。但在PL/SQL中,当使用对象类型声明对象时,系统不会自动调用构造函数。为了避免在应用程序中产生这些异常错误,可以在声明对象时,直接调用对象类型的构造函数初始化对象。

7.4 定义对象类型

7.4.1 创建对象类型

对象类型是用户定义的复合数据类型,它是对现实世界中某一实体的抽象描述,实体属性构成对象的数据结构,而实体行为则构成对象方法,这些方法可以是PL/SQL过程或函数。

使用对象编程可以将一个大型复杂系统分割为一个个逻辑上的小实体,从而降低系统的复杂性,有利于程序设计的模块化。此外,对象的最大优点是对实体属性和方法的封装,应用程序通过对象方法存取对象属性,从而达到数据隐藏的目的,在一定程度上简化客户端的程序设计。

与包类似,创建一个对象类型首先要创建对象定义,然后根据对象定义创建对象体。在PL/SQL中,分别使用CREATE FYPE和CREATE TYPE BODY语句创建对象定义和对象体。

其中:

OR REPLACE选项:指出当对象已经存在时,用当前的对象定义替换原定义,并保持原对象的授权权不变。

Type_name:是新建对象类型的名称。

Schema:指出新建对象所属模式,它默认时用户当前用户。当用户在自己模式下创建对象类型时,必须具有CREATE TYPE系统权限;当在其他用户模式下建立对象类型时,用户必须拥有CREATE ANY TYPE系统权限。

AUTHID子旬:说明应用程序在调用对象方法时所使用的权限模式,其作用与函数创建语句CREATE FUNCTION中的对应参数相同。

Attibute_name和datatype:分别说明对象类型的属性名称及其数据类型,每个对象类型必须至少拥有一个属性,但最多只能有1 000个属性。在一个对象类型内,属性名称必须唯一,其数据类型可以是下列类型之外的所有Oracle数据类型:

(1)LONG和LONG RAW。

(2)NCHAR、NCLOB和NVACHAR2。

(3)ROW/D和UROWID。

(4)BOOLEAN、PLS_INTEGER、RECORD和REF CURSOR。

(5)%TYPE和%ROWTYPE定义的数据类型。

(6)BINARY_INTEGER及其子类。

(7)PL/SQL包内定义的数据类型。

下面是使用对象类型的有关注意事项:

(1)语句CREATE TYPE是DDL语句。正因为它是一个DDL语句,所以它不能直接用在PL/SQL块中。然而,可以使用动态SQL(可以是包DBMS_SQL或本地动态SQL)来执行CREATE TYPE语句。

(2)为了创建对象类型,必须具有CREATE TYPE系统权限(该权限时角色RESOURCE的一部分)。

(3)对象类型是按数据字典对象创建的。因此,除非在创建语句CREATE TYPE……ASOBJECT中说明不同的模式,否则,待创建的对象类型都属于当前模式。

(4)说明新创建对象类型属性的语法与PL/SQL纪录的字段名或语句CREATE TABLE中使用的表的列名所使用的语法相似。

(5)与记录字段不同的是,对象类型属性不能强制为NOT NULL,也不能初始化为默认值,或使用%TYPE进行声明。

(6)同PL/SQL记录一样,可以使用符号“.”来应用对象内的属性。

(7)与其他面向对象的程序设计语言(如C++,Java)不同的是,对象类型属性都是共有的,具有EXECUTE权限的程序设计语言都可以直接修改这些属性。

7.4.2 对象构造函数

每个对象均具有一个构造函数,该函数由系统定义,其名称与对象类型同名。构造函数形式参数列表中每个参数的名称、顺序和数据类型均与对象各属性的定义相对应。在应用程序中常使用对象的构造函数来初始化对象属性,并返回对象类型实例。

在C++中,当使用类定义对象时,系统自动调用构造函数。但在PL/SQL中,当使用对象类型声明对象时,系统不会自动调用构造函数。所以,为了初始化对象属性,应用程序必须显式调用构造函数。

在调用构造函数初始化对象之前,对象及其所有对象属性均为NULL。此外,当一个空对象或NULL值赋给一个对角时,该对象也变为NULL。如果在SQL语句中调用空对象的成员方法,PL/SQL将不调用成员方法而直接返回NULL。如果在过程语句内调用一个空对象的成员方法,PL/SQL将产生SELF_IS_NULL异常错误。当访问空对象的属性时,将产生ACCESS_INTO_NULL异常错误。为了避免在应用程序中产生这些异常错误,可以在声明对象时,直接调用对象类型的构造函数初始化对象。

7.4.3 对象的方法

MEMBER和STATIC分别说明subprogram_spec子程序(函数或过程)为对象的成员方法和静态成员方法。成员方法属于对象类型的不同实例,所以,在调用成员方法时要指定对象实例名称。而静态成员方法则属于对象本身,因此,在调用静态成员方法时只需指定对象类型。静态成员方法类似于C++类中的静态成员函数,它为对象类型的不同实例所共享。

成员方法和静态成员方法的另一个区别表现在它们的第一个参数上,对象的每个成员方法都具有一个内置参数SELF,该参数可以被隐含声明或显式声明,而静态成员方法则没有此隐含参数。但无论在成员方法内怎样声明SELF参数,它总是作为第一个参数传递给成员方法,并且SELF的数据类型只能为成员方法所属对象类型。显式声明SELF参数,可以指定其参数模式,而当隐含声明,SELF在成员函数内为输入参数,在成员过程内则是输入/输出参数。

映像函数没有参数,它所返回的数据类型只能为:DATE、NUMBER、VARCHAR2和ANSI定义的SQL数据类型。而排序函数只能带两个参数,其中第一个为内置参数SELF,第二个为同类型的对象参数,其返回的数据类型只能为数字型。

在对象类型定义时,如果不提供映像函数和排序函数,应用程序只能在SQL语句中对对象进行相等和不等比较:只有当两个同类对象的所有属性均相同时,Oracle认为对象是相等的。当定义映像函数或排序函数后,应用程序即可在SQL语句和过程中对对象进行比较,并根据映像函数或排序函数的返回值做出判断。

创建对象类型后,即可像使用PL/SOL内置数据类型一样使用类型声明对象,这一过程又称作对象类型的实例化。

在程序中对象属性及成员方法的调用格式为:

对象名称.属性名称

对象名称.成员方法

7.4.4 对象方法重载

与包内子程序一样,对象类型的成员方法也可以重载。对象类型成员方法重载是指在对象内创建两个或多个同名的同类成员方法(函数或过程),这些成员方法具有不同的形式参数数量、顺序或数据类型。当应用程序调用重载成员方法时,PL/SQL根据传递给成员方法的参数即可自动判断使用哪一个成员方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈