达梦数据库的CLASS类
达梦数据库除了支持多种常用的数据类型,还支持CLASS类类型,达梦数据库通过类类型在 DMSQL 程序中实现面向对象编程的支持。类将结构化的数据及对其进行操作的过程或函数封装在一起,允许用户根据现实世界的对象建模,而不必再将其抽象成关系数据。
达梦数据库的类类型分为普通类类型和 JAVA CLASS 类型。达梦文档中的示例除了特别声明,使用的都是普通类类型。
达梦数据库类的定义分为类头和类体两部分,类头完成类的声明;类体完成类的实现。类中可以包括以下内容:
1. 类型定义
在类中可以定义游标、异常、记录类型、数组类型、以及内存索引表等数据类型,在类的声明及实现中可以使用这些数据类型;类的声明中不能声明游标和异常,但是实现中可以定义和使用。
2. 属性
类中的成员变量,数据类型可以是标准的数据类型,可以是在类中自定义的特殊数据类型。
3. 成员方法
类中的函数或过程,在类头中进行声明;其实现在类体中完成;
成员方法及后文的构造函数包含一个隐含参数,即自身对象,在方法实现中可以通过this 或 self 来访问自身对象,self 等价于 this。如果不存在重名问题,也可以直接使用对象的属性和方法。this 和 self 只能在包或对象脚本中调用。
4. 构造函数
构造函数是类内定义及实现的一种特殊的函数,这类函数用于实例化类的对象,构造函数满足以下条件:
1) 函数名和类名相同;
2) 函数返回值类型为自身类。
构造函数存在以下的约束:
1) 系统为每个类提供两个默认的构造函数,分别为 0 参的构造函数和全参的构造函数;
2) 0 参构造函数的参数个数为 0,实例的对象内所有的属性初始化值为 NULL;
3) 全参构造函数的参数个数及类型和类内属性的个数及属性相同,按照属性的顺序依次读取参数的值并给属性赋值;
4) 用户可以自定义构造函数,一个类可以有多个构造函数,但每个构造函数的参数个数必须不同;
5) 如果用户自定义了 0 个参数、或参数个数同属性个数相同的构造函数,则会覆盖相应的默认构造函数。
1、创建普通类CLASS类型
--类头创建
create class mycls
as
type rec_type is record (c1 int, c2 int); --类型声明
id int; --成员变量
r rec_type; --成员变量
--成员函数
function f1(a int, b int) return rec_type;
--用户自定义构造函数
function mycls(id int , r_c1 int, r_c2 int) return mycls;
end;
/
--类体创建
create or replace class body mycls
as
function f1(a int, b int) return rec_type
as
begin
r.c1 = a;
r.c2 = b;
return r;
end;
function mycls(id int, r_c1 int, r_c2 int) return mycls
as
begin
this.id = id; --可以使用 this.来访问自身的成员
r.c1 = r_c1; --this 也可以省略
r.c2 = r_c2;
return this; --使用 return this 返回本对象
end;
2、使用CLASS类
使用类类型同普通的数据类型一样,可以作为表中列的数据类型,DMSQL 程序语句块中变量的数据类型或过程及函数参数的数据类型。用DMSQL命令窗口执行返回的结果看不到输出的内容,只能看到“DMSQL 过程已成功完成”,最好到DM管理工具里的窗口查询能看到返回结果。
declare
type ex_rec_t is record (a int, b int); --使用一个同结构的类型代替类定义的类型
rec ex_rec_t;
o1 mycls;
o2 mycls;
begin
o1 = new mycls(1,2,3);
o2 = o1; --对象引用
rec = o2.r; --变量对象的成员变量访问
print rec.a; print rec.b;
rec = o1.f1(4,5); --成员函数调用
print rec.a; print rec.b;
print o1.id; --成员变量访问
end;
3、编译和删除CLASS类
1)重编译类:重新对类进行编译,如果重新编译失败,则将类置为禁止状态。
alter class mycls compile;
2)删除类:类的删除分为两种方式:一是类头的删除,删除类头则会顺带将类体一起删除;另外一种是类体的删除,这种方式只能删除类体,类头依然存在。
drop class mycls;