返回首页

gbase数据、南大通用产品文档:GBase8s游标的活动集

更新日期:2024年09月11日

一旦打开游标,就意味着选择一些行。查询产生的所有行的集合称为该游标的活动集。可
以简单地将活动集视为定义良好的行的集合,且将游标视为指向该集合的一行。只要没有
其他程序正在并发地修改同一数据,就会发生此情况。
创建活动集
当打开游标时,数据库服务器进行有必要的任何操作来定位选择了的数据的第一行。依赖
于该查询的叙述方式,此活动可很容易,或者它可需要大量的工作和时间。请考虑下列游
标的声明:
EXEC SQL DECLARE easy CURSOR FOR
SELECT fname, lname FROM customer
WHERE state = 'NJ'
由于在简单的方式中此游标仅需要单个表,因此,数据库服务器快速地确定是否有任何行
满足该查询,并标识第一行。第一行是该游标此次找到的唯一一行。该活动集中余下的行
仍然未知。作为对比,请考虑下列游标的声明:
EXEC SQL DECLARE hard SCROLL CURSOR FOR
SELECT C.customer_num, O.order_num, sum (items.total_price)
FROM customer C, orders O, items I
WHERE C.customer_num = O.customer_num
AND O.order_num = I.order_num
AND O.paid_date is null
GROUP BY C.customer_num, O.order_num
通过连接三个表并将输出行分组,生成此游标的活动集。优化器可能能够使用索引来以正
确的顺序产生这些行,但通常情况下,ORDER BY 或 GROUP BY 子句的使用要求在可确
定哪一行标识第一行之前,
数据库服务器生成所有行,
将它们复制到临时表并对该表排序。
在活动集全部生成并保存在临时表中的情况下,数据库服务器可花费相当多的时间来打开
游标。
接着,
数据库服务器可以确切地告诉程序活动集包含多少行。
然而,
此信息不可用。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 220 -
一个原因是您永远不可确定优化器会使用哪种模式。如果优化器可避免排序和临时表,则
它会这样做;但在查询中、在表的大小方面或在可用的索引方面的小更改都可更改优化器
的方式。

顺序游标的活动集
数据库服务器尝试使用尽可能少的资源来维护游标的活动集。如果它可这么做,则数据库
服务器从不保留下次访存的单个行之外的行。它可为大部分顺序的游标这么做。对于每一
访存,它都返回当前行的内容并定位下一行。

SCROLL 游标的活动集
必须保留 SCROLL 游标的活动集中的所有行,直到游标关闭为止,因为数据库服务器不
可确定程序下一次会请求哪一行。
更常见的是,数据库服务器将滚动游标的活动集作为临时表来实现。然而,数据库服务器
可能不立即填充此表(除非它创建了临时表来处理该查询)。通常当打开游标时,它创建
临时表。然后,第一次访存行时,数据库服务器将它复制到临时表内并将它返回到程序。
当第二次访存行时,可从临时表取得它。如果在程序访存所有行之前,它放弃该查询,则
此方案使用最少的资源。不创建或保存从不访存的行。

活动集和并发
当仅一个程序正在使用数据库时,活动集的成员不可更改。大多数个人计算机都是这种情
况,且是要考虑的最简单情况。但必须为了在多编程系统中使用来设计一些程序,在此,
两个、三个或几十个不同的程序可同时在相同的表上工作。
在您的游标是打开的时,当其他程序可更新表时,活动集的思路用处不大了。您的程序在
某一时刻仅看到一行数据,但表中的所有其他行可能正在更改。
在简单查询的情况下,当数据库服务器仅持有活动集的一行时,任何其他行都可更改。在
您的程序访存行之后的那一刻,
另一程序可删除同一行或更新它,
于是,
如果在此检查它,
它不再是活动集的一部分。
当在临时表中保存活动集或它的一部分时,旧数据可出现问题。即,从其派生活动集行的
实际的表中的行可更改。如果真是这样,某些活动集行不再反映当前的表内容。
最初这些想法令人不安,但只要您的程序仅读取数据,就不存在旧数据,更确切地说,所
有数据都同样陈旧。活动集是数据在某一时刻的快照。第二天行就不一样了;如果它在下
一毫秒也不一样,倒无所谓。换言之,在程序正在运行时发生的更改,与该程序终止的那
一刻保存和应用的更改之间,没有实际的差异。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 221 -
旧数据可导致问题的唯一时刻,
是当程序打算使用输入的数据来修改同一数据库时;
例如,
当银行业应用程序必须读取账户余额、更改它并将它写回时。通过 SQL 程序修改数据 讨
论修改数据的程序。

GBASE_TIME
 结构说明
该结构用于将DATE、
TIME、
DATETIME 和TIMESTAMP 数据直接发送到服务器,
或从服务器直接接收这类数据。
 结构成员
名 称
类 型
描 述
year
unsigned int
年份
month
unsigned int
月份
day
unsigned int

hour
unsigned int
小时
minute
unsigned int
分钟
second
unsigned int

neg
unsigned int
布尔标志,用于指明时间是否为负


GBase 8a 程序员手册C API 篇


- 54 -

南大通用数据技术股份有限公司

或者,
DBA 可使用 CREATE ROLE 语句定义一个角色,
并使用 GRANT 和 REVOKE 语
句来将角色分配给用户或取消,以及授予和撤销角色权限。例如:
GRANT engineer TO nmartin;
需要 SET ROLE 语句来激活非缺省的角色。
要获取关于角色和权限的更多信息,
请参阅 访
问管理策略 和 对数据库级对其对象的权限。要获取关于 GRANT 和 REVOKE 语句的更
多信息,请参阅《GBase 8s 数据库设计和实现指南》。要获取关于这些语句的语法的更多
信息,请参阅《GBase 8s SQL 指南:语法》。