达梦数据库编程指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5.8 类类型

DM通过类类型在DM SQL程序中实现面向对象方法的程序设计。类将结构化的数据及对其进行操作的过程或函数封装在一起。允许用户根据现实世界的对象建模,而不必再将其抽象成关系数据。

DM的类的定义分为类头和类体两部分,类头完成类的声明;类体完成类的实现。类中可以有以下内容。

(1)类型定义。在类中可以定义游标、异常、记录、数组及内存索引表等数据类型。在类的声明中不能声明游标和异常,但是在类的实现中可以定义和使用。

(2)属性。类中的成员变量、数据类型可以是标准的数据类型,也可以是在类中自定义的特殊数据类型。

(3)成员方法。类中的函数或过程,在类头中声明,在类体中实现。成员方法及构造函数包含一个隐含参数,即自身对象,在方法实现中可以通过“this”来访问自身对象。如果不存在重名问题,那么也可以直接使用对象的属性和方法。

(4)构造函数。构造函数是类内定义及实现的一种特殊函数,这类函数用于实例化类的对象。构造函数满足以下条件。

① 函数名和类名相同。

② 函数返回值类型为自身类。

构造函数存在以下约束。

① 系统为每个类提供两个默认的构造函数,分别为无参构造函数和全参构造函数。

② 无参构造函数的参数个数为0,实例对象内所有的属性初始化值都为NULL。

③ 全参构造函数的参数个数及类型与类内属性的个数及属性相同,按照属性的顺序依次读取参数的值并给属性赋值。

④ 用户可以自定义构造函数,一个类可以有多个构造函数,但每个构造函数的参数个数必须不同。

⑤ 如果用户自定义了0个参数或参数个数同属性个数相同的构造函数,则会覆盖相应的默认构造函数。

下面从类的声明、类的实现、类的删除、类体删除和类的使用5个方面来详细介绍类类型的实现过程。

1.类的声明

类的声明在类头中完成。类头定义通过CREATE CLASS语句完成,其语法格式如下:

img

语法说明如下。

(1)类中元素可以任意顺序出现,其中的对象必须在引用之前进行声明。

(2)过程和函数的声明都是前向声明,类声明中不包括任何实现代码。有权限使用该语句的用户必须是DBA或具有CREATE CLASS数据库权限的用户。

2.类的实现

类的实现通过类体完成。类体的定义通过CREATE CLASS BODY语句完成,其语法格式如下:

img

语法说明如下。

(1)类声明中定义的对象对于类体而言都是可见的,不需要声明就可以直接引用。这些对象包括变量、游标、异常和类型定义。

(2)类体中的过程、函数定义必须和类声明中的声明完全相同,包括过程名、参数列表的参数名和数据类型定义。

(3)类中可以有重名的成员方法,要求其参数列表各不相同。系统会根据用户的调用情况进行重载(Overload)。

(4)权限。使用该语句的用户必须是DBA或该类对象的拥有者,并且具有CREATE CLASS数据库权限的用户。

【例2-21】完整的类头、类体创建。

img
img

3.类的删除

类的删除分为两种方式:一种是类头的删除,删除类头的同时会一并删除类体;另一种是类体的删除,这种方式只能删除类体,类头依然存在。

删除类头:类的删除通过DROP CLASS完成,即类头的删除。语法格式如下:

img

语法说明如下。

(1)如果被删除的类不属于当前模式,则必须在语句中指明模式名。

(2)如果一个类的声明被删除,那么对应的类体被自动删除。

(3)权限说明:执行该操作的用户必须是该类的拥有者,或者具有DBA权限。

4.类体删除

类体删除即从数据库中删除一个类的实现主体对象。语法格式如下:

img

语法说明如下。

(1)如果被删除的类不属于当前模式,则必须在语句中指明模式名。

(2)权限说明:执行该操作的用户必须是该类的拥有者,或者具有DBA权限。

5.类的使用

类类型同普通的数据类型一样,可以作为表列的数据类型、程序块中变量的数据类型,以及过程和函数参数的数据类型。类的使用规则如下。

(1)作为表列的类型或其他类成员变量属性的类型,不能被修改或删除类中定义的数据类型,其名称只在类的声明及实现中有效。如果类内函数的参数或返回值是类内数据类型,或者进行类内成员变量的复制,则需要在PL/SQL程序块中定义一个结构与之相同的类型。根据类使用方式的不同,对象可分为变量对象及列对象。变量对象指的是在PL/SQL程序块中声明类类型的变量;列对象指的是表中类类型的列。变量对象可以修改其属性的值,而列对象不能。

(2)变量对象的实例化。实例化通过NEW表达式调用构造函数完成。

(3)变量对象的引用。通过“=”进行的类类型变量之间的赋值是对对象的引用,并没有复制一个新的对象。

(4)变量对象属性访问。可以通过<对象名>.<属性名>方式进行属性的访问。

(5)变量对象成员方法调用。成员方法的调用通过<对象名>.<成员方法名>(<参数>{,<参数>})方式进行。如果成员方法内修改了对象内属性的值,则该修改生效。

(6)列对象的插入。列对象的创建是通过使用INSERT语句向表中插入数据实现的,插入语句中的值是变量对象,插入后存储在表中的数据即列对象。

(7)列对象的复制。存储在表中的对象不允许对对象中的成员变量进行修改,通过INTO语句进行的查询或“=”操作符进行的列到变量的赋值是对象的赋值,生成了一个与列对象数据一样的副本,在该副本上进行的修改不会影响表中列对象的值。

(8)列对象的属性访问。通过<列名>.<属性名>方式进行属性的访问。

(9)列对象的方法调用。通过<列名>.<成员方法名>(<参数>{,<参数>})调用。

在列对象方法调用过程中对类型内属性的修改,都是在列对象的副本上进行的,不会影响列对象的值。

(10)对象表的更新。表中存储的列对象虽然不能进行修改,但是可以通过UPDATE语句直接更新某行数据,即并不是修改对象内属性的值,而是直接替换了对象。

【例2-22】类类型的变量对象、列对象的应用。

(1)变量对象的应用实例如下:

img

(2)列对象的应用实例如下:

① 表的创建:

img

② 列对象的创建——插入数据:

img

③ 列对象的复制及访问:

img