Skip to content

结构类型(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:过程的具体定义。

示例

  1. 创建用户定义类型(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);
  2. 创建表。创建一个表obj_tab,其中包含一个列udt_obj,该列的类型是刚刚创建的udt_obj_type。

    sql
    --创建表:
    CREATE TABLE obj_tab(id INT,state VARCHAR2,type VARCHAR,udt_obj UDT_OBJ_TYPE);
  3. 插入数据。

    • 使用构造函数插入数据。可以直接使用构造函数在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;
  4. 查询数据。

    • 可以查询表中的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 |