用户定义的类型

用户定义的数据类型 (UDT) 是派生自现有数据类型的数据类型。 您可以使用 UDT 来扩展已可用的内置类型,并创建自己的定制数据类型。

有六种用户定义的类型:
  • 单值类型
  • 结构化类型
  • 引用类型
  • 数组类型
  • 行类型
  • 游标类型
以下各部分描述了其中每种类型。

单值类型

单值类型 是用户定义的数据类型,它与现有内置数据类型 (其 "源" 类型) 共享其内部表示。

单值类型包括限定标识。 如果在 CREATE TYPE (单值) , DROP 或 COMMENT 语句以外的语句中使用时未使用模式名称来限定单值类型名称,那么将按顺序搜索 SQL 路径以查找具有匹配单值类型的第一个模式。

源自 LOB 类型的单值类型受与其源类型相同的限制。

单值类型将定义为使用强类型化规则或弱类型化规则。 强类型规则是缺省值。
强类型化的单值类型
对于大多数操作,强类型化的单值类型视为单独且不兼容的类型。 例如,要定义图片类型,文本类型和音频类型。 其中每种类型都有不同的语义,但每种类型都使用内置数据类型 BLOB 作为其内部表示。
以下示例说明了如何创建一个名为 AUDIO 的单值类型:
   CREATE TYPE AUDIO  AS BLOB (1M)
虽然 AUDIO 与内置数据类型 BLOB 具有相同的表示,但它被视为单独的类型; 此注意事项允许创建专门针对 AUDIO 编写的函数,并确保这些函数不会应用于任何其他数据类型 (例如图片或文本) 的值。

强类型的单值类型支持强类型化,方法是确保只有那些在单值类型上显式定义的函数和运算符才能应用于其实例。 因此,强类型单值类型不会自动获取其源类型的函数和运算符,因为这些函数和运算符可能没有意义。 例如,可定义 LENGTH 函数以支持数据类型为 AUDIO 的参数,该参数返回对象的长度 (以秒为单位,而不是以字节为单位)。

弱类型化的单值类型
对于所有操作,弱类型化的单值类型视为与其源类型相同,只是当弱类型化的单值类型在赋值或强制类型转换期间对值应用约束时例外。 此注意事项也适用于函数解析。
以下示例说明如何创建名为 POSITIVEINTEGER 的单值类型:
   CREATE TYPE POSITIVEINTEGER AS INTEGER
         WITH WEAK TYPE RULES CHECK (VALUE>=0)
弱类型化意味着除了只接受正整数值之外, POSITIVEINTEGER 的操作方式与其底层数据类型 INTEGER 相同。

弱类型单值类型可用作引用应用程序代码中内置数据类型的替代方法。 对与单值类型关联的值定义约束的能力提供了一种方法,用于在赋值和强制类型转换期间检查值。

使用单值类型可以在以下类别中提供收益:
可扩展性
通过定义新的数据类型,您可以增加可用于支持应用程序的数据类型集。
灵活性
您可以通过使用用户定义的函数 (UDF) 来扩充系统中可用的数据类型的多样性,为新数据类型指定任何语义和行为。
一致且继承的行为
强类型可保证只有在单值类型上定义的函数才能应用于单值类型的实例。 弱类型化可确保单值类型与其底层数据类型的行为方式相同,因此可以使用可用于该底层类型的所有相同函数和方法。
封装 (encapsulation)
通过使用弱类型的单值类型,可以在一个位置为该单值类型的应用程序代码中的所有用途定义数据类型约束。
性能
单值类型高度集成到数据库管理器中。 由于单值类型在内部的表示方式与内置数据类型相同,因此它们共享用于实现组件 (例如内置函数,比较运算符和内置数据类型的索引) 的相同高效代码。

并不是所有内置数据类型都可以用来定义单值类型。 源数据类型不能是 XML ,数组,行或游标。 有关更多信息,请参阅 CREATE TYPE (distinct) 语句

结构化类型

结构化类型 是用户定义的数据类型,具有在数据库中定义的结构。 它包含一系列指定的 属性,每个属性都具有数据类型。 结构化类型还包括一组方法规范。

可以将结构化类型用作表、视图或列的类型。 当用作表或视图的类型时,该表或视图称为 类型表类型视图。 对于类型表和类型视图,结构化类型的属性的名称和数据类型将成为此类型表或类型视图的列的名称和数据类型。 可以将类型表或带类型视图的行视作结构化类型实例的表示。 当用作列的数据类型时,该列包含该结构化类型的值 (或该类型的任何子类型的值,如本节后面所定义)。 方法用于检索或处理结构化列对象的属性。

超类型 是定义了其他结构化类型 (称为 子类型) 的结构化类型。 子类型继承其超类型的所有属性和方法,并且可以定义其他属性和方法。 与公共超类型相关的结构化类型集称为类型 层次结构 ,没有任何超类型的类型称为类型层次结构的 根类型

术语子类型适用于用户定义的结构化类型以及在类型层次结构中位于其下方的所有用户定义的结构化类型。 因此,结构化类型 T 的子类型是 T ,并且层次结构中的所有结构化类型都低于 T。 结构化类型 T 的 正确子类型 是类型层次结构中低于 T 的结构化类型。

在类型层次结构中有递归类型定义的限制。 因此,有必要开发一种速记方式来引用允许的特定类型的递归定义。 使用以下定义:
  • 直接使用: 类型 A 表示直接使用另一类型 B,如果且仅当下列其中一个语句为 true 时:
    1. 类型 A 具有类型为 B的属性。
    2. 类型 BA的子类型或 A的超类型。
  • 间接使用: 如果下列其中一个语句为 true ,那么 A 类型表示间接使用 B类型:
    1. 类型 A 直接使用类型 B
    2. 类型 A 直接使用某种类型 C,类型 C 间接使用类型 B

不能定义类型以使其某个属性类型直接或间接使用自身。 如果需要具有此类配置,请考虑使用引用作为属性。 例如,对于结构化类型属性,当 "manager" 的类型为 "employee" 时,不能存在属性为 "manager" 的 "employee" 实例。 但是,可以具有类型为 REF (employee) 的 "manager" 属性。

如果某些其他对象直接或间接使用类型,那么无法删除类型。 例如,如果表或视图列直接或间接使用类型,那么无法删除类型。

引用类型

引用类型 是结构化类型的配套类型。 与单值类型类似,引用类型是与其中一个内置数据类型共享公共表示的标量类型。 对于类型层次结构中的所有类型,将共享此相同表示。 在创建类型层次结构的根类型时定义引用类型表示。 使用引用类型时,会将结构化类型指定为该类型的参数。 此参数称为引用的 目标类型

引用的目标始终是类型表或类型视图中的行。 使用引用类型时,可以定义 作用域 。 作用域标识包含引用值的目标行的表 (称为 目标表) 或视图 (称为 目标视图)。 目标表或视图必须具有与引用类型的目标类型相同的类型。 作用域引用类型的实例唯一地标识类型表或类型视图 (称为 目标行) 中的行。

数组类型

用户定义的 数组类型 是定义为具有其他数据类型的元素的数组的数据类型。 每个普通数组类型都具有数据类型为 INTEGER 的索引,并且具有定义的最大基数。 每个关联数组都具有数据类型为 INTEGER 或 VARCHAR 的索引,并且没有定义的最大基数。

行类型

行类型 是一种数据类型,定义为指定字段的有序序列,每个字段都具有关联的数据类型,有效表示一行。 行类型可以用作 SQL PL 中变量和参数的数据类型,以提供对一行数据的简单操作。

游标类型

用户定义的 游标类型 是使用关键字 CURSOR 定义的用户定义的数据类型,并且可以选择使用关联的行类型。 具有关联行类型的用户定义游标类型是 强类型游标类型; 否则,它是 弱类型游标类型用户定义的游标类型的值表示对底层游标的引用。