返回首页

gbase数据、南大通用产品文档:GBase8sGCI多线程开发

更新日期:2024年09月11日

GCI接口是线程安全的, 所以能够很好的支持多线程并发。在多线程开发过程中, 需要分别
为每个线程分配单独的环境句柄、上下文句柄和语句句柄,以此保证线程的安全性和程序的
正确性。
注: GCI接口打开log日志时,不是线程安全的。

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 4
2 2 配置文件与参数设置

您可通过访问游标内的集合来更新集合元素,就如同您选择或删除个别的元素一样。
如果您想要更新集合 SET{100, 200, 300, 500} 来将值 500 更改为 400,
请从数据库将该 SET
检索至集合变量内,然后声明游标来在 SET 中的元素间移动,如下图所示。
图: 更新集合元素。
DEFINE s SET(INTEGER NOT NULL);
DEFINE n INTEGER;

SELECT numbers INTO s FROM orders
WHERE order_num = 10;

FOREACH cursor1 FOR
SELECT * INTO n FROM TABLE(s)
IF ( n == 500 ) THEN
UPDATE TABLE(s)(x)
SET x = 400 WHERE CURRENT OF cursor1;
EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;
END FOREACH
UPDATE 语句使用集合变量 s 作为集合派生的表。要指定集合派生的表,请使用 TABLE
关键字。
在 UPDATE 语句中跟在 (s) 之后的值 (x) 是您提供的列名称 derived column,
因为
SET 子句需要它,即使集合派生的表没有列也需要。
请将集合派生的表视作有一行,且看起来与下列示例有些相似:
100 200 300 500

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

在此示例中,x 是包含值 500 的“列”的虚构的列名称。如果您正在更新内建的、opaque、
distinct 或集合类型元素的集合,则仅指定派生的列。如果您正在更新 row 类型的集合,
请使用字段名,而不是派生的列,如 更新 row 类型的集合 描述的那样。

使用变量更新集合
您还可使用存储在变量中的值,而不是文字值,来更新集合。
下图中的 SPL 过程使用类似于 图 1 展示的语句,
除了此过程是使用变量,
而不是文字值,
来更新 manager 表的 direct_reports 列中的 SET。图 2 定义该 manager 表。
图: 使用变量更新集合。
CREATE PROCEDURE new_report(mgr VARCHAR(30),
old VARCHAR(30), new VARCHAR(30) )

DEFINE s SET (VARCHAR(30) NOT NULL);
DEFINE n VARCHAR(30);

SELECT direct_reports INTO s FROM manager
WHERE mgr_name = mgr;

FOREACH cursor1 FOR
SELECT * INTO n FROM TABLE(s)
IF ( n == old ) THEN
UPDATE TABLE(s)(x)
SET x = new WHERE CURRENT OF cursor1;
EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;
END FOREACH

UPDATE manager SET mgr_name = s
WHERE mgr_name = mgr;

END PROCEDURE;
嵌套在 FOREACH 循环中的 UPDATE 语句使用集合派生的表 s 和派生的列 x。如果 n 的
当前值与 old 相同,则 UPDATE 语句将它更改为 new 的值。第二个 UPDATE 语句
在 manager 表中存储新集合。

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

COUNT(expr)
函数说明
返回一个SELECT 语句检索出来的记录行中非NULL 值的记录总数目。
示例
示例1:检索满足条件的记录总数,并按c_mktsegment 进行分组。
gbase> SELECT c.c_mktsegment,COUNT(*) FROM ssbm.lineorder l,
ssbm.customer c WHERE l.lo_custkey = c.c_custkey GROUP BY
c.c_mktsegment;
+--------------+----------+
| c_mktsegment | COUNT(*) |
+--------------+----------+
| HOUSEHOLD
|
1217475 |
| AUTOMOBILE
|
1174124 |
| BUILDING
|
1230857 |
| FURNITURE
|
1182372 |
| MACHINERY
|
1196343 |
+--------------+----------+
5 rows in set
说明
COUNT(*)在它返回检索出的记录行的数目上稍微有点不同,
它不管
记录行中是否包括NULL 值。
因为,
ssbm 是一个随机生成数据的演示数据库,
因此执行结果会有差异,上述结果只是一个演示结果。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
863