GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 303 -
假设您想要您的 SPL 例程从存储在集合变量内的集合选择元素,
则请一次选择一个,
以便
于您可处理这些元素。
要在集合的元素间移动,
您首先需要使用 FOREACH 语句来声明游标,
就如同您会声明游
标来在一组行间一同一样。
下图展示 FOREACH 和 END FOREACH 语句,
在它们之间还
没有语句。
图: FOREACH 和 END FOREACH 语句。
FOREACH cursor1 FOR
. . .
END FOREACH
在 FOREACH 循环 和 GBase 8s SQL 指南:语法 中描述 FOREACH 语句。
下一主题,集合查询,描述在 FOREACH 与 END FOREACH 语句之间省略的那些语句。
下列部分中的示例是基于 图 2 的 polygons 表的。
集合查询
在您在 FOREACH 与 END FOREACH 语句之间声明游标之后,
请您输入称为集合查询的
特殊的、受限形式的 SELECT 语句。
集合查询是使用后跟集合变量的名称的 FROM TABLE 关键字的 SELECT 语句。下图展
示此结构,称其为集合派生的表。
图: 集合派生的表。
FOREACH cursor1 FOR
SELECT * INTO pnt FROM TABLE(vertexes)
. . .
END FOREACH
该 SELECT 语句使用集合变量 vertexes 作为集合派生的表。
您可将集合派生的表视为一列
的表,
该集合的每一元素都是表的一行。
例如,
您可将存储在 vertexes 中的四个点的 SET 可
视化作为带有四行的表,诸如下图展示的一个。
图: 带有四行的表。
'(3.0,1.0)'
'(8.0,1.0)'
'(3.0,4.0)'
'(8.0,4.0)'
在前图中的 FOREACH 语句的第一个迭代之后,
该集合查询选择 vertexes 中的第一个元素,
并将其存储在 pnt 中,因此,pnt 包含值 '(3.0,1.0)'。
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 304 -
提示: 由于集合变量 vertexes 包含 SET,而不是 LIST,因此,vertexes 中的元素没有定义了的
顺序。在真实的数据库中,值 '(3.0,1.0)' 可能不是 SET 中的第一个元素。
将集合查询添加至 SPL 例程
现在,您可将以 FOREACH 定义的游标和集合查询添加至 SPL 例程,如下例所示。
图: 以 FOREACH 定义的游标和集合查询。
CREATE PROCEDURE shapes()
DEFINE vertexes SET( point NOT NULL );
DEFINE pnt point;
SELECT definition INTO vertexes FROM polygons
WHERE id = 207;
FOREACH cursor1 FOR
SELECT * INTO pnt FROM TABLE(vertexes)
. . .
END FOREACH
. . .
END PROCEDURE;
以上展示的语句形成处理集合变量的元素的 SPL 例程的框架。要将集合分解为它的元素,
请使用集合派生的表。在将集合分解为它的元素之后,该例程可单独地访问元素作为集合
派生的表的行。既然您已选择了 pnt 中的一个元素,您就可更新或删除那个元素,如 更新
集合元素 和 删除集合元素 描述的那样。
要了解集合查询的完整语法,请参阅《GBase 8s SQL 指南:语法》 中的 SELECT 语句。
要了解集合派生的表的语法,请参阅《GBase 8s SQL 指南:语法》 中的“集合派生的表”
段。
提示:
如果您正在从不包含元素或包含零元素的集合选择,
则您可使用未声明游标的集合查询。
然而,如果该集合包含多个元素,且您未使用游标,则您会收到错误消息。
注意: 在上述程序段中,如果 FOREACH 游标定义内的查询(
SELECT * INTO pnt FROM TABLE(vertexes)
)已以分号(;)作为语句终止符终止了,则数据库服务器可能已发出了语法错误。在此,
END FOREACH 关键字是逻辑的语句终止符。