4从复杂类型选择数据
本章描述如何查询复杂数据类型。复杂数据类型是使用SQL类型构造函数从其他数据类 型的组合构建的。SQL语句可以访问复杂数据类型中的个别组件。复杂数据类型是行类型 或集合类型。
ROW类型具有组合一个或多个相关数据字段的实例。这两种ROW类型是己命名和未命 名。
集合类型具有这样的实例:在其中,每种集合值包含具有相同数据类型的一组元素,这些 数据类型可以是任何基本或复杂数据类型。集合可以由LIST、SET或MULTISET数据 类型组成。
重要:对于复杂数据类型没有跨数据库的支持。只能在本地数据库中对它们进行操作。
有关数据库服务器支持的数据类型的更完整描述,请参阅《GBase 8s SQL参考指南》中的 数据类型一章。
有关如何创建使用复杂类型的信息,请参阅《GBase 8s SQL参考指南》和《GBase 8s SQL 指南:语法》。
4.1选择行类型数据
本节描述如何查询定义为行类型的数据。ROW类型是一个复杂类型,包含一个或多个相 关数据字段。
两种ROW类型如下:
已命名ROW类型
己命名的ROW类型可以定义表、列、其它行类型列的字段、程序变量、语句变量以 及例程返回值。
未命名ROW类型
未命名ROW类型可以定义列、其它行类型列的字段、程序变量、语句局部变量、例 程返回值和常量。
本节中使用的示例使用己命名ROW类型zip_t、address_t和employee_t,这些ROW类 型定义employee表。下图显示创建ROW类型和表的SQL语法。
图:创建ROW类型和表的SQL语法
CREATE ROW TYPE zip_t
(
z_code CHAR(5), z_suffix CHAR(4)
CREATE ROW TYPE address_t
(
street VARCHAR(20),
city VARCHAR(20),
state CHAR(2),
zip zip_t
)
CREATE ROW TYPE employee』
(
name VARCHAR(30),
address address_t, salary INTEGER
)
CREATE TABLE employee OF TYPE employee_t
已命名的ROW 类型zip_t、address_t和employee_t充当类型表employee的字段和列的模 板。类型表是在已命名ROW类型上定义的表。充当employee表的模板的employee_t类 型将address_t类型用作address字段的数据类型。address_t类型使用zip_t类型作为zip字 段的数据类型。
下图显示了创建student表的SQL语法。student表的s_address列定义为未命名的ROW 类型。(s_address列被定义为已命名的ROW类型。)
图:创建student表的SQL语法
CREATE TABLE student
(
s_name VARCHAR(30),
s_address ROW(street VARCHAR (20), city VARCHAR(20), state CHAR(2), zip VARCHAR(9)),
grade_point_avg DECIMAL(3,2)
)
4.1.1选择类型表的列
对类型表的查询与对任何其他表的查询没有区别。例如:下列查询使用星号(*)来指定返 回employee表所有列的SELECT语句。
图:查询
SELECT * FROM employee
employee表上的SELECT语句返回所有列的所有行。
图:查询结果
name |
Paul, J. |
|
address salary |
ROW(1O2 Ruby, Belmont, CA, 49932, 1000) 78000 |
|
name |
Davis, J. |
|