结构类型(OBJECT)
类型介绍
数据库使用OBJECT表示结构类型,允许直接表示E-R设计中的复合属性,其设计类似于面向对象语言(eg.Java)支持父类继承,包括结构类型规范和结构类型体两个部分,是在其他数据类型基础上建立的,可以包含多个属性(元素)和多种方法(成员函数),这些属性和方法构成了结构化的数据单元。成员函数的类型有构造函数(cosntructor)、静态函数(static)和普通成员函数(member)。
说明:
- 重载:结构类型支持方法重载,即可以有多个同名但参数不同的方法。
- 继承:结构类型支持继承,但子类不能重写父类的成员函数(同名同参)。
模式级别创建的结构类型可以持久化存储在数据库中,记载到系统表SYS_TYPES和SYS_OBJECT中。OBEJCT类型可以当成表的字段类型、变量类型、参数类型,返回值类型等在其他对象中调用。
语法格式
创建OBJECT类型:
sql
CREATE [ OR REPLACE ] TYPE udt_name AS OBJECT(
[ variable_define ],
[ function_declare ],
[ procedure_declare ]
);
-- 可选,当且仅当OBJECT中有声明过程或函数时,才需要该部分
CREATE [ OR REPLACE ] TYPE BODY udt_name
{ IS | AS }
[ function_define ],
[ procedure_define ]
END;
参数说明
variable_define
:变量(或称为属性)定义,其中变量可以是基础类型或UDT数据类型。function_declare
:函数声明。函数可分为如下三类:- 构造函数:形式为
CONSTRUCTOR udt_name(arguments)
;其中函数名和Object名相同,参数的个数和类型要和本Object中的变量相对应。 - 静态函数:形式为
STATIC function_name([ arguments ])RETURN ret_type
;其中arguments
为函数的参数,可有一个、多个或无参数,每个参数可以用可选的关键词(IN | OUT | IN OUT)
修饰;ret_type
为函数的返回值。 - 普通成员函数:形式为
MEMBER function_name([ arguments ]) RETURN ret_type
;其中arguments
为函数的参数,可有一个、多个或无参数,每个参数可以用可选的关键词(IN | OUT | IN OUT)
修饰;ret_type
为函数的返回值。
- 构造函数:形式为
procedure_declare
:过程声明。过程可分为如下两类:- 静态过程:形式为
STATIC procedure_name([ arguments ])
;其中arguments
为过程的参数,可有一个、多个或无参数,每个参数可以用可选的关键词(IN | OUT | IN OUT)
修饰。 - 普通成员过程:形式为
MEMBER procedure_name([ arguments ])
;其中arguments
为过程的参数,可有一个、多个或无参数,每个参数可以用可选的关键词(IN | OUT | IN OUT)
修饰。
- 静态过程:形式为
function_define
:函数的具体定义。procedure_define
:过程的具体定义。
示例
创建用户定义类型(UDT)。创建一个对象类型udt_obj_type,它包含四个属性:n、class、type和dt。
sql--创建类型: CREATE OR REPLACE TYPE udt_obj_type AS OBJECT(n NUMERIC,class VARCHAR2,type VARCHAR, dt DATE);
创建表。创建一个表obj_tab,其中包含一个列udt_obj,该列的类型是刚刚创建的udt_obj_type。
sql--创建表: CREATE TABLE obj_tab(id INT,state VARCHAR2,type VARCHAR,udt_obj UDT_OBJ_TYPE);
插入数据。
- 使用构造函数插入数据。可以直接使用构造函数在INSERT语句中插入数据。sql
-- 字段类型 INSERT INTO obj_tab(id,state,type,udt_obj) VALUES(1,'构造函数插入', 'udt_obj_type',udt_obj_type(1.0,'一层','udt_obj_type','2021-08-24 00:00:00'));
- 使用变量插入数据。在 PL/SQL 块中声明一个变量,然后将该变量插入到表中。sql
-- 变量类型 DECLARE udt_obj UDT_OBJ_TYPE; BEGIN udt_obj := UDT_OBJ_TYPE(1.0,'一层','udt_obj_type','2021-08-24 00:00:00'); INSERT INTO obj_tab(id, state, type, udt_obj)VALUES(1, 'plsql通过udt变量插入数据', 'udt_obj_type', udt_obj); END;
- 使用构造函数插入数据。可以直接使用构造函数在INSERT语句中插入数据。
查询数据。
- 可以查询表中的udt_obj列,查看整个UDT对象。sql
--查询UDT整体: SELECT id, udt_obj FROM obj_tab; ID | UDT_OBJ | ------------------------------------------------------------------------------ 1 | [1,一层,udt_obj_type,2021-08-24 00:00:00]| 1 | [1,一层,udt_obj_type,2021-08-24 00:00:00]|
- 直接在SQL语句中创建UDT对象并查看其内容。sql
SELECT udt_obj_type(1.0,'一层','udt_obj_type','2021-08-24 00:00:00'); EXPR1 | ------------------------------------------------------------------------------ [1,一层,udt_obj_type,2021-08-24 00:00:00]|
- 查询UDT的部分属性。sql
-- 查询udt_obj列中的特定属性 SELECT udt_obj.n, udt_obj.type, udt_obj.dt FROM obj_tab; EXPR1 | EXPR2 | EXPR3 | ------------------------------------------------------------------------------ 1| udt_obj_type| 2021-08-24 AD | 1| udt_obj_type| 2021-08-24 AD |
- 可以查询表中的udt_obj列,查看整个UDT对象。