CREATE TYPE 声明用于指定类型的名称及其属性、方法和其他属性。

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 系统权限。否则,类型所有者没有足够的权限来授予其他用户该类型的访问权限。

语法

说明

本章节只包含部分重点语法节点的格式。

  • create_type_stmt 格式为:

    1create_type_stmt

  • plsql_type_spec_source 格式为:

    2plsql_type_spec_source

  • object_type_def 格式为:

    4object_type_def

  • attr_and_element_spec 格式为:

    13attr_and_element_spec

  • element_spec 格式为:

    element_spec

  • el_element_spec_list_cc 格式为:

    el_element_spec_list_cc

  • element_spec_long 格式为:

    element_spec_long

  • inheritance_final_instantiable_clause 格式为:

    inheritance_final_instantiable_clause

  • inheritance_overriding_instantiable_clause 格式为:

    inheritance_overriding_instantiable_clause

  • el_element_spec 格式为:

    el_element_spec

  • subprogram_spec 格式为:

    subprogram_spec

  • constructor_spec 格式为:

    constructor_spec

  • map_order_function_spec 格式为:

    map_order_function_spec

语义

语法

关键字或语法节点

说明

create_type_stmt

OR REPLACE

重新创建该类型(如果存在),然后重新编译。

在重新定义类型之前被授予权限的用户仍然可以访问该类型,而无需重新获得权限。如果任何基于函数的索引依赖于该类型,则数据库会将索引标记为 DISABLED。

plsql_type_spec_source

pl_schema_name

包含类型的 Schema 的名称。 默认值为您的 Schema。

TYPE

ADT 的名称、嵌套表类型或 VARRAY 类型。

varray_type_def

将类型创建为元素的有序集合,每个元素具有相同的数据类型。

nested_table_type_def

创建一个类型的嵌套表,命名为 datatype

object_type_def

object_type_def

创建一个 ADT。形成数据结构的变量称为属性(Attributes)。定义ADT 行为的成员子程序称为方法(Methods)。

创建 ADT 时需要使用关键字 AS OBJECT

AS OBJECT(包含于 object_or_under)

创建 Schema 级别的 ADT。此类 ADT 有时称为根 ADT。

attr_and_element_spec

element_spec

指定 ADT 的每个属性。

subprogram_spec

subprogram_spec

声明子过程。

member_or_static

  • MEMBER

    与 ADT 关联的函数或存储过程,被称为成员函数。通常,调用 MEMBER 方法主体中具有一个隐式第一参数,称为 SELF 。该参数表示调用该方法的对象。

  • STATIC

    与 ADT 关联的函数或存储过程。与 MEMBER 方法不同,STATIC 方法没有任何隐式参数。您无法在主体引用 SELF。 它们通常的调用形式为 type_name.method()

proc_or_func_spec

指定存储过程或函数的参数和数据类型。如果此子程序不包含存储过程或函数的声明,则必须通过CREATE TYPE BODY命令做相应的声明。

如果要创建子类型,则存储过程或函数的名称不能与在超类型链中声明的任何属性的名称(无论是否继承)相同。

constructor_spec

constructor_spec

创建一个用户定义的构造函数,用于返回 ADT 初始化实例。如果每个 ADT 的参数在数量、顺序或数据类型上不同,则可以为单个 ADT 声明多个构造函数。

用户定义的构造函数始终是FINAL 和 INSTANTIABLE,因此这些关键字是可选的。

用户定义的构造函数的参数传递模式始终为 SELF IN OUT。 因此,除非明确说明,否则无需指定此子句。

RETURN SELF AS RESULT指定构造函数返回值类型是 SELF 参数的类型。

map_order_function_spec

map_order_function_spec

您可以在类型说明中定义一个 MAP 方法或一个 ORDER 方法,而无需考虑定义了多少 MEMBER 或STATIC 方法。如果声明了这两种方法,则可以在 SQL 中比较对象实例。

如果未声明任何方法,则只能比较对象实例是否相等,无法对对象实例进行排序。只有每个类型的对应属性对都相同时,相同类型定义的实例才相等。无需指定比较方法来确定两个ADT 的相等性。

如果要对对象实例执行大量排序或哈希联接操作,请使用 MAP。一次性应用 MAP 将对象映射到标量值,这样数据库在排序和合并期间可以使用标量。 MAP 方法比 ORDER 方法更有效,后者必须为每个对象比较调用该方法。您必须使用 MAP 方法进行哈希联接,而不能使用 ORDER 方法,因为哈希机制会打乱对象值的顺序。

MAP MEMBER

指定 MAP 成员函数,该函数返回给定实例在所有实例中的相对位置。MAP 方法被隐式调用,并通过将对象实例映射到预定义标量类型的值来指定其顺序。PL 使用该顺序来评估布尔表达式并执行比较。

如果 MAP 方法的参数为 null,则 MAP 方法返回null,并且不会调用该方法。

类型主体只能包含一个MAP 方法,该方法必须是一个函数。MAP 函数除隐式 SELF 参数外不能具有其他参数。

ORDER MEMBER

指定一个 ORDER 成员函数,该函数将对象的实例作为显式参数和隐式 SELF 参数,并返回负整数、零或正整数,分别表示隐式 SELF 参数小于、等于或大于显式参数。

如果 ORDER 方法的任何一个参数为 null,则ORDER 方法返回 null,并且不会调用该方法。

在 ORDER BY 子句中比较具有相同 ADT 定义的实例时,数据库将调用 ORDER MEMBER sqlj_func_decl

对象规范只能包含一个 ORDER 方法,该方法必须是具有返回类型 NUMBER 的函数。

子类型既不能定义也不能覆盖 ORDER 方法。