云原生数据库 PolarDB:创建对象类型
您可以使用CREATE TYPE命令创建对象类型规格,并可以使用CREATE TYPE BODY命令创建对象类型主体。本节提供一些如何使用CREATE TYPE和CREATE TYPE BODY命令的示例。
第一个示例创建addr_object_type对象类型,其中只包含属性,不包含方法:
由于此对象类型中不存在方法,因此不需要对象类型主体。此示例创建了一个复合类型,使您可以将相关对象视为单个属性。
成员方法是在某一对象类型中定义的函数或存储过程,只能通过该类型的实例进行调用。成员方法可访问它们运行所在的对象实例的属性,并且可更改这些属性。
以下对象类型规格创建emp_obj_typ对象类型:
对象类型emp_obj_typ包含一个名为display_emp的成员方法。display_emp使用SELF参数,后者传递调用该方法的对象实例。
SELF参数的数据类型是所定义的对象类型的数据类型。SELF始终引用调用方法的实例。SELF参数是成员存储过程或函数中的第一个参数,无论它是否在参数列表中明确声明。
以下代码片段为emp_obj_typ定义对象类型主体:
您也可以在对象类型主体中使用SELF参数。为阐释如何在CREATE TYPE BODY命令中使用SELF参数,上述对象类型主体可按如下所示编写:
这两个版本的emp_obj_typ主体完全相同。
与成员方法一样,静态方法也属于某一类型。但是静态方法不是由类型的实例进行调用,而是通过使用类型的名称进行调用。例如,要调用 emp_obj_type 类型中定义的名为 get_count 的静态函数,您将编写以下语句:
静态方法无权访问对象实例的属性,也不能更改这些属性,并且通常不使用类型的实例。
以下对象类型规格包含静态函数get_dname和成员存储过程display_dept:
dept_obj_typ的对象类型主体定义一个名为get_dname的静态函数和一个名为display_dept的成员存储过程:
在静态函数get_dname中,不能有对SELF的引用。由于静态函数的调用独立于任何对象实例,因此没有对任何对象属性的隐式访问权。
成员存储过程display_dept可以访问SELF参数中传递的对象实例的deptno属性。不必在display_dept参数列表中明确声明SELF参数。
构造函数方法是一个函数,该函数通过为对象的成员分配值来创建对象类型的实例。对象类型可以定义多个构造函数来完成不同的任务。构造函数方法是一个成员函数(通过SELF参数进行调用),其名称与类型的名称相匹配。
例如,如果定义名为address的类型,则每个构造函数也名为address。通过创建一个或多个同名但参数类型不同的不同构造函数,可以重载构造函数。
SPL编译器将为每个对象类型提供默认构造函数。默认构造函数是一个成员函数,其名称与类型的名称匹配,并且其参数列表与类型成员也匹配(按顺序)。例如,给出如下对象类型:
SPL 编译器将提供具有以下特征的默认构造函数:
默认构造函数的主体只是将每个成员设置为NULL。
要创建自定义构造函数,请在CREATE TYPE中声明该构造函数(使用关键字constructor),然后在CREATE TYPE BODY命令中定义该构造函数。例如,您可能希望为address类型创建一个自定义构造函数,它在给出street_address和postal_code时计算城市和州。
要创建对象类型的实例,将调用该类型的某一构造函数方法。例如:
自定义构造函数通常用于在给定的信息不完整时计算成员值。上一示例在给出邮政编码时计算city和state的值。