暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

南大通用GBase8s 常用SQL语句(317)

原创 谨言慎行817 2022-11-21
517



使用 SELECT ... INTO 语句

如在 FOREACH 的图表中所指出的,并非 SELECT 语句的所有子句和选项都可用在 FOREACH 语句中。FOREACH 语句中的 SELECT 语句必须包含 INTO 子句。它还可以包括 UNION 和 ORDER BY 子句,但不能使用 INTO TEMP 子句。关于 SELECT 语法和用法的完整描述,请参阅 SELECT 语句。变量列表中的每个变量的数据类型和计数必须与 SELECT ... INTO 语句返回的每个值相匹配。

如果您在 FOREACH 语句中包含分号(; )以终止 SELECT ... INTO 规范,则该语句发出错误。例如,以下示例程序片段因产生语法错误而失败:

CREATE DBA PROCEDURE IF NOT EXISTS 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); -- Semicolon not valid

. . .

END FOREACH

. . .

END PROCEDURE;

在上面的示例中,您可以通过删除紧跟在 TABLE(vertexes) 规范之后的分号来避免此错误。

使用 SELECT 语句的 ORDER BY 子句

使用 SELECT 语句的 ORDER BY 子句表示查询返回多行。除非您使用 SQL 的 DECLARE 语句定义 Select 游标或 Function 游标,否则如果您在 FOREACH 循环的上下文之外指定 ORDER BY 子句以在 SPL 例程中单独处理返回的行,数据库服务器将发出错误。

有关 SPL 例程中 DECLARE 语句的语法和用法,请参阅在 SPL 例程中声明动态游标。

使用 Hold 游标

WITH HOLD 关键字指定(通过提交或回滚)关闭事务时游标仍保持打开。

更新或删除由游标名称标识的行

如果打算在 UPDATE 或 DELETE 语句(这些语句在 FOREACH 循环中 cursor 的当前行上操作)中使用 WHERE CURRENT OF cursor 子句,请在 FOREACH 循环中指定 cursor 名称。虽然不能在 FOREACH 语句的 SELECT ... INTO 段中包含 FOR UPDATE 关键字,但该游标的表现类似 FOR UPDATE 游标。

有关锁定的讨论。请参阅使用 Update 游标进行锁定部分。有关隔离级别的讨论,请参阅SET ISOLATION 语句的描述。

使用集合变量

FOREACH 语句允许您为 SPL 集合变量声明游标。 这种游标称为集合游标。使用集合变量访问集合(SET、 MULTISET 、LIST)列的元素。当要访问集合变量中的一个或多个元素时,请使用游标。

以下来自 SPL 例程的摘抄显示了如果填充集合游标然后如何使用游标访问个别元素:

DEFINE a SMALLINT;

DEFINE b SET(SMALLINT NOT NULL);

SELECT numbers INTO b FROM table1 WHERE id = 207;

FOREACH cursor1 FOR

SELECT * INTO a FROM TABLE(b);

...

END FOREACH;

在此示例中,SELECT 语句从集合变量 b 中一次选择一个元素插入到元素变量 a 中。该投影列表是星号,因为集合变量 b 包含内置类型的集合。变量 b 与 TABLE 关键字作为 Collection-Derived Table 一起使用。有关更多信息,请参阅集合派生表。

下一个示例还显示了如果填充集合变量以及如果使用变量存取个别元素。但是,此示例在它的投影列表中使用 ROW 类型字段的列表:

DEFINE employees employee_t;

DEFINE n VARCHAR(30);

DEFINE s INTEGER;

SELECT emp_list into employees FROM dept_table

WHERE dept_no = 1057;

FOREACH cursor1 FOR

SELECT name,salary

INTO n,s FROM TABLE( employees ) AS e;

...

END FOREACH;

这里的集合变量 employees 包含一个 ROW 类型的集合。每个 ROW 类型包含 name 和 salary 字段。该集合查询每次查询一个名字和薪水,并将 name 放到 n 中将 salary 放到 s 中。AS 关键字声明 e 作为集合派生表 employees 的别名。只要 SELECT 语句执行,该别名就存在。

集合游标上的限制

当使用集合游标从集合变量获取个别元素时,FOREACH 语句具有以下限制:

它不能包含 WITH HOLD 关键字。

它必须在 FOREACH 循环中包含受限制的 SELECT 语句。

此外,与集合游标相关联的 SELECT 语句具有以下限制:

它的一般结构为 SELECT… INTO … FROM TABLE。该语句从按照 TABLE 关键字指定的集合变量中一次选择一个元素放入另一个被称为 element variable 的变量。

它不能在 Projection 列表中包含表达式。

它不能包含以下子句或选项:WHERE 、GROUP BY 、ORDER BY 、HAVING 、INTO TEMP 和 WITH REOPTIMIZATION。

该元素变量的数据类型必须与集合的元素类型相同。

元素变量的数据类型可以是任何 Opaque 、Distinct 或集合数据类型,或者任何除 BIGSERIAL 、BLOB 、BYTE 、CLOB 、SERIAL 、SERIAL8 或 TEXT 外的内置数据类型。

如果集合变量包含 Opaque 类型、Distinct 类型、内置类型或集合数据类型,则投影列表必须是星号(*)。

如果集合包含 ROW 类型,则投影列表可以是一个或多个字段名称的列表。

修改集合变量中的元素

要修改 SPL 例程中的集合的元素,必须首先使用 FOREACH 语句声明游标。

然后在 FOREACH 循环内,将集合变量用作 SELECT 查询中的集合派生的表,从集合变量一次选择一个元素。

当游标放置到要更新的元素上时,可以如下使用 WHERE CURRENT OF 子句:

带有 WHERE CURRENT OF 子句的 UPDATE 语句更新集合变量的当前元素中的值。

带有 WHERE CURRENT OF 子句的 DELETE 语句删除集合变量的当前元素中的值。

 

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论