在您将集合检索至集合变量内之后,您可将值插入至该集合变量。INSERT 语句的语法略
有不同,这依赖于您想要条件到的 集合的类型。
插入至 SET 或 MULTISET 内
要插入至存储在集合变量中的 SET 或 MULTISET 内,请使用 INSERT 语句,并跟在带
有集合变量的 TABLE 关键字之后,如下图所示。
图: 插入至存储在集合变量中的 SET 或 MULTISET 内。
INSERT INTO TABLE(p_coll) VALUES(3);
TABLE 关键字使得集合变量成为集合派生的表。在 处理 SELECT 语句中的集合 部分中
描述集合派生的表。前图派生的集合是一列的虚拟表,集合的每一元素表示表的一行。在
插入之前,请将 p_coll 考虑作为包含下图展示的行(元素)的虚拟表。
图: 虚拟表元素。
5
7
31
19
13
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 301 -
在插入之后,p_coll 可能看上去像下图所示的虚拟表一样。
图: 虚拟表元素。
5
7
31
19
13
3
由于该集合为 SET,因此,将新的值添加到该集合,但未定义新元素的位置。对于
MULTISET ,适用同样的原理。
提示: 您一次仅可将一个值插入至简单的集合内。
插入至 LIST 内
如果集合为 LIST,
则您可将新的元素添加在 LIST 中的特定点,
或添加在 LIST 的末尾。
如同 SET 或 MULTISET 一样,
您必须首先定义集合变量,
并从数据库将集合选择至该集
合变量内。
下图展示您需要定义集合变量并从 numbers 表选择 LIST 至该集合变量内的语句。
图: 定义集合变量并选择 LIST。
DEFINE e_coll LIST(INTEGER NOT NULL);
SELECT evens INTO e_coll FROM numbers
WHERE id = 99;
此时,e_coll 的值可能为 LIST {2,4,6,8,10}。由于 e_coll 保存 LIST,因此,每一元素有在
该列表中的编号的位置。
要将元素添加在 LIST 中特定的位置,
请将 AT position 子句添加
到 INSERT 语句,如下图所示。
图: 将元素添加在 LIST 中特定的点。
INSERT AT 3 INTO TABLE(e_coll) VALUES(12);
现在,e_coll 中的 LIST 有元素 {2,4,12,6,8,10},依此顺序。
您在 AT 子句中为 position 输入的值可为数值或变量,但它必须有 INTEGER 或
SMALLINT 数据类型。您不可使用字母、浮点数值、十进制值或表达式。
检查 LIST 集合的基数
有时,您可能想要将元素添加在 LIST 的末尾。在此情况下,您可使用 cardinality() 函数来
找到 LIST 中的元素的编号,然后输入一个大于cardinality() 返回的值的位置。
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 302 -
GBase 8s 允许您随同存储在列中的集合来使用 cardinality() 函数,
但不允许随同存储在集合
变量中的集合来使用。在 SPL 例程中,您可以 SELECT 语句检查列中的集合的基数,并
将该值返回给变量。
假设在 numbers 表中,其 id 列为 99 的那一行的 evens 列仍然包含集合 LIST {2,4,6,8,10}。
这一次,您想要将元素 12 添加在该 LIST 的末尾。您可使用 SPL 过程 end_of_list 实现,
如下图所示。
图: end_of_list SPL 过程。
CREATE PROCEDURE end_of_list()
DEFINE n SMALLINT;
DEFINE list_var LIST(INTEGER NOT NULL);
SELECT CARDINALITY(evens) FROM numbers INTO n
WHERE id = 100;
LET n = n + 1;
SELECT evens INTO list_var FROM numbers
WHERE id = 100;
INSERT AT n INTO TABLE(list_var) VALUES(12);
END PROCEDURE;
在 end_of_list 中,
变量 n 保存 cardinality() 返回的值,
即,
LIST 中的项数。
LET 语句使 n 递
增,
以便于 INSERT 语句可在 LIST 的最后的位置插入值。
SELECT 语句将来自该表的一
行的集合选择至集合变量 list_var 内。INSERT 语句将元素 12 插入在该列表的结尾。
VALUES 子句的语法
当您插入至 SPL 集合变量内时,VALUES 子句的语法与当您插入至集合列内时是不一样
的。将文字插入至集合变量内的语法规则如下:
在 VALUES 关键字之后使用圆括号来括起值的完整列表。
如果您正在插入至简单的集合内,则无需使用类型构造函数或方括号。
如果您正在插入至嵌套的集合,则您需要指定文字的集合。