返回首页

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

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

通过连接三个表并将输出行分组,生成此游标的活动集。优化器可能能够使用索引来以正
确的顺序产生这些行,但通常情况下,ORDER BY 或 GROUP BY 子句的使用要求在可确
定哪一行标识第一行之前,数据库服务器生成所有行,将它们复制到临时表并对该表排序。

在活动集全部生成并保存在临时表中的情况下,数据库服务器可花费相当多的时间来打开
游标。接着,数据库服务器可以确切地告诉程序活动集包含多少行。然而,此信息不可用。
一个原因是您永远不可确定优化器会使用哪种模式。如果优化器可避免排序和临时表,则
它会这样做;但在查询中、在表的大小方面或在可用的索引方面的小更改都可更改优化器
的方式。

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

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

活动集和并发
当仅一个程序正在使用数据库时,活动集的成员不可更改。大多数个人计算机都是这种情
况,且是要考虑的最简单情况。但必须为了在多编程系统中使用来设计一些程序,在此,
两个、三个或几十个不同的程序可同时在相同的表上工作。
在您的游标是打开的时,当其他程序可更新表时,活动集的思路用处不大了。您的程序在
某一时刻仅看到一行数据,但表中的所有其他行可能正在更改。
在简单查询的情况下,当数据库服务器仅持有活动集的一行时,任何其他行都可更改。在
您的程序访存行之后的那一刻,另一程序可删除同一行或更新它,于是,如果在此检查它,
它不再是活动集的一部分。
当在临时表中保存活动集或它的一部分时,旧数据可出现问题。即,从其派生活动集行的
实际的表中的行可更改。如果真是这样,某些活动集行不再反映当前的表内容。

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

最初这些想法令人不安,但只要您的程序仅读取数据,就不存在旧数据,更确切地说,所
有数据都同样陈旧。活动集是数据在某一时刻的快照。第二天行就不一样了;如果它在下
一毫秒也不一样,倒无所谓。换言之,在程序正在运行时发生的更改,与该程序终止的那
一刻保存和应用的更改之间,没有实际的差异。
旧数据可导致问题的唯一时刻,是当程序打算使用输入的数据来修改同一数据库时;例如,
当银行业应用程序必须读取账户余额、更改它并将它写回时。通过 SQL 程序修改数据 讨
论修改数据的程序。

功能
用来指定对blob 或clob 类型列数据的编码方式。
说明

text:表示将blob 或clob 类型列内容按二进制方式导出,这种方式导出可能存在列分
隔符或行分隔符与字段内容冲突的问题,支持单条记录数据长度最大为64M,超过64M 时
报错;

base64:
表示将blob 或clob 类型列内容按base64 编码方式导出,
这种方式导出解决了
列分隔符或行分隔符与字段内容冲突的问题,支持单条记录数据长度最大64M,超过64M
时报错;

url:表示将blob 或clob 类型列内容按url 方式导出,即每个lob 字段内容以单独文件
方式保存在磁盘上,在导出的主数据文件中记录的是lob 文件相对于主数据文件的相对路
径。
示例
示例1
./orato8a --encoding=base64
示例2
./orato8a --encoding=url
示例3

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
540
./orato8a -Ebase64
示例4
./orato8a -Eurl
参数说明
表4- 111 参数说明
参数全称
参数简称
取值范围
默认值
encoding
E
text
base64
url
text

ifx_lo_specget_flags() 函数从智能大对象获取创建时间标记。
语法
ifx_lo_specget_flags(lospec, flags)
参数
该函数接受以下参数。
参数
类型
用于
描述
lospec
SQL_INFX_UDT_FIXED
输入
智能大对象规范结构
flags
SQL_INTEGER
输出
创建时间标记。