3.5 扩展数据类型
GBase 8s 使您能够创建扩展数据类型来表示用内置数据类型不易表示的数据。(但是
不能在查询外部表的分布式事务中使用扩展数据类型。)可以创建下列类别的扩展数据类
型:
• 复杂数据类型
• 单值数据类型
• 不透明数据类型
下面各节提供了这些数据类型中的每一种的概述。
3.5.1 复杂数据类型
复杂数据类型可以存储一个或多个其他内置或扩展数据类型的值。
图 1 显示了 GBase 8s 支持的复杂数据类型。
图: GBase 8s 的复杂数据类型

下表总结了复杂数据类型的结构。
表 1. 集合类型是由元素组成的复杂数据类型,每个元素都具有相同的数据类型。
表 2. ROW 类型是由字段组成的复杂数据类型。

以嵌套复杂数据类型。例如,可以构造其字段包括一个或多个 set、multiset、ROW 类
型和列表的 ROW 类型。同样,集合类型也可以具有数据类型为 ROW 类型或集合类型的
元素。
包括不透明类型的复杂类型继承以下支持函数。
• input
• output
• send
• recv
• import
• export
• import_binary
• export_binary
• assign
• destroy
• LO_handles
• hash
• lessthan
• equal
• lessthan(仅适用于 ROW 类型)
接下来的各个主题对复杂数据类型进行了概述。
集合数据类型
集合数据类型是由一个或多个元素(所有元素都具有相同的数据类型)组成的复杂类
型。集合元素可以为除 BYTE、TEXT、SERIAL、SERIAL8 或 BIGSERIAL 之外的任何
数据类型(包括其他复杂类型)。
要点: 元素不能具有 NULL 值。必须对集合元素指定 NOT NULL 约束。没有其他约束
对于集合有效。
GBase 8s 支持三种类型的内置集合类型:LIST、SET 和 MULTISET。用来声明这些
集合的关键字是类型构造函数的名称或只是构造函数。有关集合类型的语法,请参阅 GBase
8s SQL 指南:语法。可以将相同表的不超过 97 列声明为集合数据类型。
当为集合指定元素值时,将元素值列示在构造函数后面并用花括号( { } ) 括起来。
例如,假设您具有含以下 MULTISET 数据类型的集合列:
CREATE TABLE table1
(
mset_col MULTISET(INTEGER NOT NULL)
)
下一个 INSERT 语句向此列添加一组元素值。(这两个示例中的单词 MULTISET 是
MULTISET 构造函数。)
INSERT INTO table1 VALUES (MULTISET{5, 9, 7, 5})
可使花括号保留为空来指示空集:
INSERT INTO table1 VALUE (MULTISET{})
空集合不等同于列的 NULL 值。
访问集合数据
要存取集合列的元素,必须将集合访存到集合变量中并修改集合变量的内容。集合变
量可以具有任何下列类型:
• SPL 例程中的变量
有关更多信息,请参阅 GBase 8s SQL 指南:教程。
• GBase 8s ESQL/C 程序中的主变量
有关更多信息,请参阅 GBase 8s ESQL/C 程序员手册。
还可以使用嵌套点表示法来存取集合数据。有关访问集合元素的更多信息,请参阅
GBase 8s SQL 指南:教程。
重要: 集合数据类型作为用于函数索引的函数的自变量无效。
ROW 数据类型
ROW 数据类型是一个或多个元素(称为字段)的有序集合。每个字段都具有名称和数
据类型。行的字段与表列差不多,但有一些重要的差别:
• 字段没有缺省子句。
• 不能对字段定义约束。
• 只能将字段与行类型一起使用,而不能将其与表一起使用。
存在两种类型的 ROW 数据类型:
• 命名 ROW 数据类型是用其名称标识的。
• 未命名 ROW 数据类型是用其结构标识的。
未命名 ROW 数据类型的结构是其字段的数目(和数据类型的顺序)。
可以将同一个表的不超过 195 列声明为 ROW 数据类型。有关 ROW 数据类型的更
多信息,请参阅 ROW 数据类型,已命名和 ROW 数据类型,未命名。
您可以在命名与未命名 ROW 数据类型之间进行强制转型。




