首批通过分布式安全可靠测评,为关键业务系统打造
CREATE TYPE
更新时间:2026-03-26 17:56:44
CREATE TYPE 用于指定类型的名称及其属性、方法和其他属性。
功能适用性
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版暂不支持。
CREATE TYPE 声明创建或替换以下规范:
抽象数据类型(ADT)
独立的可变数组(VARRAY)类型
独立嵌套表类型
不完整对象类型
不完整类型是由前向类型定义创建的类型。之所以称为不完整,是因为它具有名称,但没有属性或方法。它可以被其他类型引用,允许自定义相互引用的类型。 但是,必须先创建完成类型,然后才能用于创建表的列、对象列或嵌套表类型的列。
CREATE TYPE BODY 声明自带实现该类型的代码。
说明
- 如果创建的类型规范仅声明属性而不声明方法,则无需创建 Body。
- 使用 CREATE TYPE 声明,可以创建嵌套表和 VARRAY 类型,但不能创建关联数组。在 PL 块或包中,可以定义三种集合类型。
前提条件
要在 Schema 中创建类型,您必须具有 CREATE TYPE 的系统权限。要在其他用户的 Schema 中创建类型,您必须具有 CREATE ANY TYPE 的系统权限。您可以直接获得这些权限,也可以通过角色获取权限。
必须明确授予该类型的所有者 EXECUTE 对象权限,以访问该类型的定义中引用的所有其他类型,或者必须向该类型所有者授予 EXECUTE ANY TYPE 系统权限。所有者无法通过角色获得这些权限。
如果类型所有者打算授予其他用户对该类型的访问权限,则必须使用 GRANT OPTION 为所有者授予该类型的 EXECUTE 对象权限,或者通过 ADMIN OPTION 授予所有者 EXECUTE ANY TYPE 系统权限。否则,类型所有者没有足够的权限来授予其他用户该类型的访问权限。
在 OceanBase 数据库的当前版本中,当您通过 CREATE TABLE 语句创建新表时,尽管您可以定义自己的对象类型(也称为用户定义的对象类型 - UDT),但是这些自定义类型不能用作数据库表中列的数据类型。即,您不能直接使用这些 UDT 作为表结构的一部分,例如,您无法创建一个列,将其类型直接指定为您自定义的对象类型。
然而,即使在建表时无法使用用户定义的对象类型 (UDT),在编写 PL/SQL 程序时,您仍然可以用自定义对象类型定义程序内部使用的变量、参数,以及函数的返回类型。
语法
说明
本章节只包含部分重点语法节点的格式。
create_type_stmt格式为:
plsql_type_spec_source格式为:
object_type_def格式为:
attr_and_element_spec格式为:
element_spec格式为:
el_element_spec_list_cc格式为:
element_spec_long格式为:
inheritance_final_instantiable_clause格式为:
inheritance_overriding_instantiable_clause格式为:
subprogram_spec格式为:
proc_or_func_spec格式为:
语义
| 语法 | 关键字或语法节点 | 说明 |
|---|---|---|
| create_type_stmt | OR REPLACE | 重新创建该类型(如果存在),然后重新编译。在重新定义类型之前被授予权限的用户仍然可以访问该类型,而无需重新获得权限。如果任何基于函数的索引依赖于该类型,则数据库会将索引标记为 DISABLED。 |
| plsql_type_spec_source | pl_schema_name | 包含类型的 Schema 的名称。默认值为您的 Schema。 |
| plsql_type_spec_source | TYPE | ADT 的名称、嵌套表类型或 VARRAY 类型。 |
| plsql_type_spec_source | FORCE | 如果 type_name 存在并且有类型依赖,但没有表依赖,FORCE 强制该语句替换类型。(如果 type_name 有表依赖,无论是否使用 FORCE,语句都将失败。)
注意如果类型 |
| plsql_type_spec_source | varray_type_def | 将类型创建为元素的有序集合,每个元素具有相同的数据类型。 |
| plsql_type_spec_source | nested_table_type_def | 创建一个类型的嵌套表,命名为 datatype。 |
| object_type_def | object_type_def | 创建一个 ADT。形成数据结构的变量称为属性(Attributes)。定义 ADT 行为的成员子程序称为方法(Methods)。创建 ADT 时需要使用关键字 AS OBJECT。 |
| object_type_def | AS OBJECT | 创建 Schema 级别的 ADT。此类 ADT 有时称为根 ADT。 |
| attr_and_element_spec | element_spec | 指定 ADT 的每个属性。 |
| subprogram_spec | subprogram_spec | 声明子过程。 |
| subprogram_spec | member_or_static |
|
| subprogram_spec | proc_or_func_spec | 指定存储过程或函数的参数和数据类型。如果此子程序不包含存储过程或函数的定义,则必须通过 CREATE TYPE BODY命令做相应的定义。 如果要创建子类型,则存储过程或函数的名称不能与在超类型链中声明的任何属性的名称(无论是否继承)相同。 |
示例
创建类型代码示例
示例 1:创建对象类型
创建一个名为 person_typ 的对象类型,它有两个属性:name 和 age,以及一个成员函数 get_age 用来返回对象的年龄。
CREATE TYPE person_typ AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION get_age RETURN NUMBER);
示例 2:创建变长数组(VARRAY)类型
创建一个名为 number_list 的 VARRAY 类型,它可以存储最多 10 个数字。
CREATE TYPE number_list AS VARRAY(10) OF NUMBER;
完整使用示例
我们以创建对象类型为例,为您展示一个完整的使用方法。
步骤 1:创建对象类型
首先,您需要定义对象类型及其成员函数。这里我们假设成员函数 get_age 只是简单地返回对象的年龄。
CREATE OR REPLACE TYPE person_typ AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION get_age RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY person_typ AS
MEMBER FUNCTION get_age RETURN NUMBER IS
BEGIN
RETURN self.age;
END get_age;
END;
/
步骤 2:从 PL/SQL 中使用对象类型
创建表
people。CREATE TABLE people (person_id NUMBER, person_name VARCHAR2(50), person_age NUMBER);在 PL/SQL 程序中,您可以声明
person_typ类型的变量来操作这些数据:DECLARE v_person person_typ := person_typ('Alice', 30); BEGIN -- 插入数据到 people 表中 INSERT INTO people (person_id, person_name, person_age) VALUES (1, v_person.name, v_person.age); COMMIT; END; /