复杂数据类型可以存储一个或多个其他内置或扩展数据类型的值。
图 1 显示了 GBase 8s 支持的复杂数据类型。
图: GBase 8s 的复杂数据类型
下表总结了复杂数据类型的结构。
表 1. 集合类型是由元素组成的复杂数据类型,每个元素都具有相同的数据类型。
集合类型
描述
LIST
一组有序元素,每个元素在组中不必是唯一的。
MULTISET
一组元素,每个元素不必是唯一的。忽略元素的顺序。
SET
一组元素,每个元素都是唯一的。忽略元素的顺序。
GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 128 -
表 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 类型)
ROW 类型
描述
命名 ROW 类型
用其名称标识的行类型。
未命名 ROW 类型
用其结构标识的行类型。
GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 129 -
接下来的各个主题对复杂数据类型进行了概述。有关更多信息,请参阅《GBase 8s
数据库设计和实现指南》。
集合数据类型
集合数据类型是由一个或多个元素(所有元素都具有相同的数据类型)组成的复杂类
型。集合元素可以为除 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 数据类型
GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 130 -
ROW 数据类型是一个或多个元素(称为字段)的有序集合。每个字段都具有名称和数据类型。行的
字段与表列差不多,但有一些重要的差别:
字段没有缺省子句。
不能对字段定义约束。
只能将字段与行类型一起使用,而不能将其与表一起使用。
存在两种类型的 ROW 数据类型:
命名 ROW 数据类型是用其名称标识的。
未命名 ROW 数据类型是用其结构标识的。
未命名 ROW 数据类型的结构是其字段的数目(和数据类型的顺序)。
可以将同一个表的不超过 195 列声明为 ROW 数据类型。有关 ROW 数据类型的更多信息,请参
阅 ROW 数据类型,已命名和 ROW 数据类型,未命名。
您可以在命名与未命名 ROW 数据类型之间进行强制转型;《GBase 8s 数据库设计和实现指南》中
对此进行了描述。