返回首页

gbase数据、南大通用产品文档:GBase8s将元素插入至集合变量内

更新日期:2024年09月11日

在您将集合检索至集合变量内之后,您可将值插入至该集合变量。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 关键字之后使用圆括号来括起值的完整列表。
如果您正在插入至简单的集合内,则无需使用类型构造函数或方括号。
如果您正在插入至嵌套的集合,则您需要指定文字的集合。

数据库是包含表和索引的逻辑存储单元。 (请参阅表。)每个数据库还包含跟踪有关数
据库中许多元素(包括表、索引、SPL 例程和完整性约束)的信息的系统目录。
数据库位于由 CREATE DATABASE 语句指定的数据库空间中。当未在 CREATE
DATABASE 语句中明确指定数据库空间时,数据库将位于根数据库空间中。当在
CREAT DATABASE 语句中明确指定了数据库空间时,此数据库空间的位置就是以下表
的位置:

数据库系统目录表

属于该数据库的任何表
下图显示了 stores_demo 数据库中包含的表。
图: stores_demo 数据库


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 166 -

应用于数据库的大小限制与它们在数据库空间中的位置相关。要确保数据库中的所有表都
创建在特定的物理设备上,只能向该设备指定一个块并创建仅包含该块的数据库空间。将
数据库放置在该数据库空间中。当您在指定给特定的物理设备的块中放置数据库时,该数
据库的大小不能超过该块的大小。
有关如何列出创建的数据库的指示信息,请参阅显示数据库。

 摘要:
初始化逐行的结果集检索。如果成功,gbase_use_result()将复位
gbase_error()和gbase_errno()。



GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司

- 49 -
 语法:
GBASE_RES * gbase_use_result(GBASE *gbase);
 参数:
 返回值:
GBASE_RES 结果结构。如果出现错误,返回NULL。
 错误
CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
CR_OUT_OF_MEMORY


内存溢出。
CR_SERVER_GONE_ERROR

GBase 服务器不可用。
CR_SERVER_LOST


在查询过程中,与服务器的连接丢失。
CR_UNKNOWN_ERROR


出现未知错误。