返回首页

gbase数据、南大通用产品文档:GBase8s删除集合元素

更新日期:2024年09月11日

在您将个别的元素从集合变量选择至元素变量内之后,您可从集合删除该元素。例如,在
您以集合查询从集合变量 vertexes 选择一个点之后,您可将该点从集合移除。
删除集合元素涉及的步骤包括:
1. 声明集合变量和元素变量。
2. 将集合从数据库选择至集合变量内。
3. 声明游标,以便于您可从集合变量一次选择一个元素。
4. 编写定位您想要删除的元素的循环或分支。
5. 使用 DELETE WHERE CURRENT OF 语句来从集合删除元素,
该语句使用集合变
量作为集合派生的表。
下图展示删除 vertexes 中四个点之一的例程,以便于多边形成为三角形,而不是矩形。
图: 删除四个点之一的例程。
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)
IF pnt = '(3,4)' THEN
-- calls the equals function that
-- compares two values of point type
DELETE FROM TABLE(vertexes)
WHERE CURRENT OF cursor1;
EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 300 -

END FOREACH
. . .
END PROCEDURE;
在前图中,FOREACH 语句声明游标。SELECT 语句是集合派生的查询,从集合变
量 vertexes 一次将选择一个元素至元素变量 pnt。
IF THEN ELSE 结构测试当前在 pnt 中的值,看它是否为点 '(3,4)'。请注意,表达式 pnt =
'(3,4)' 调用在点数据类型上定义的 equal() 函数的实例。如果 pnt 中的当前值为 '(3,4)',则
DELETE 语句删除它,且 EXIT FOREACH 语句退出该游标。
提示: 从存储在集合变量中的集合删除元素,未将它从存储在数据库中的集合删除。在您从集
合变量删除元素之后,您必须以新的集合更新存储在数据库中的集合。要了解展示如何更新集
合列的示例,请参阅 更新数据库中的集合。
在《GBase 8s SQL 指南:语法》中描述 DELETE 语句的语法。

更新数据库中的集合
在您(通过删除、更新或插入元素)更改 SPL 例程中集合变量的内容之后,您必须以新的
集合更新数据库。
要更新数据库中的集合,请添加一个设置表中的集合列的 UPDATE 语句,设置为更新了
的集合变量的内容。例如,下图中的 UPDATE 语句展示如何更新 polygons 表,来
将 definition 列设置为存储在集合变量 vertexes 中的新集合。
图: 更新数据库中的集合。
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)
IF pnt = '(3,4)' THEN
-- calls the equals function that
-- compares two values of point type
DELETE FROM TABLE(vertexes)
WHERE CURRENT OF cursor1;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 301 -

EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;
END FOREACH

UPDATE polygons SET definition = vertexes
WHERE id = 207;

END PROCEDURE;
现在,shapes() 例程完成。在您运行 shapes() 之后,更新存储在其 ID 列为 207 的行中的集
合,以便于它包含三个值,而不是四个。
您可使用 shapes() 例程作为框架,来编写操纵集合的其他 SPL 例程。
出现在存储在 polygons 表的 207 的 definition 列中的集合的元素罗列如下:
'(3,1)'
'(8,1)'
'(8,4)'

删除整个集合
如果您想要删除集合的所有元素,您可使用单个 SQL 语句。您无需声明游标。要删除整
个集合,您必须执行下列任务:

定义集合变量。

将该集合从数据库选择至集合变量内。

输入使用集合变量作为集合派生的表的 DELETE 语句。

更新来自数据库的集合。
下图展示您可能在 SPL 例程中用于删除整个集合的语句。
图: 删除整个集合的 SPL 例程。
DEFINE vertexes SET( INTEGER NOT NULL );

SELECT definition INTO vertexes FROM polygons
WHERE id = 207;

DELETE FROM TABLE(vertexes);


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 302 -

UPDATE polygons SET definition = vertexes
WHERE id = 207;
此种形式的 DELETE 语句删除集合变量 vertexes 中的整个集合。
您不可使用一个使用集合
派生的表的 DELETE 语句中的 WHERE 子句。
在 UPDATE 语句之后,polygons 表包含空的集合,其中 id 列等于 207。
在 GBase 8s SQL 指南:语法 中描述 DELETE 语句的语法。


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 83 -
尽管超表上的 SELECT 语句同时从该超表及其子表中返回行。
但是不能辨别哪些行来自超
表,哪些行来自子表。要将查询的结果限制为只是超表,必须在 SELECT 语句中包含
ONLY 关键字。例如,下列查询只返回 person 表中的行。
图: 查询
SELECT * FROM ONLY(person);
图: 查询结果
name Rogers, J.
address ROW(102 Ruby Ave, Belmont, CA, 69055)
soc_sec 454849344

子查询(内部 SELECT 语句,其中一个 SELECT 语句嵌套在另一个 SELECT 语句中)
可以返回多行或多个表达式,也可以不返回任何结果。每个子查询必须用括号分隔,并且
都必须包含一个 Projection 子句和一个 FROM 子句,子查询本身可以包含其它子查询。
数据库服务器支持下列上下文中的子查询:

嵌套在另一个 SELECT 语句的 Projection 子句中的 SELECT 语句

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 131 -


嵌套在另一个 SELECT 语句中的 WHERE 子句中的 SELECT 语句

嵌套在另一个 SELECT 语句的 FROM 子句中的 SELECT 语句
还可以在 INSERT 、DELETE 、MERGE 或 UPDATE 语句(子查询有效)的各种子句中
指定子查询。
Projection 子句或 WHERE 子句中的子查询可以是相关的或是不相关的。当子查询产生的
值取决于包含它的外部 SELECT 语句产生的值时,该子查询是相关的。有关更多信息,请
参阅相关子查询。
任何其它类型的子查询都被认为是不相关的。在 SELECT 语句的 FROM 子句中,只有不
相关的子查询才是有效的。