返回首页

gbase数据、南大通用产品文档:GBase8s保持游标

更新日期:2024年09月11日

当使用事务日志记录时,GBase 8s 保证在事务结束时,可回滚在事务内所作的一切。要可
靠地处理事务,数据库服务器通常应用下列规则:

当事务结束时,关闭所有游标。

当事务结束时,释放所有锁。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 260 -
对于支持事务的大多数数据库系统,用于可靠地处理事务的规则都是正常的。然而,存在
一些情况,随同游标使用标准事务是不可能的。例如,在没有事务的情况下,下列代码正
常工作。然而,当添加事务时,关闭游标与同时使用两个游标发生冲突。
EXEC SQL DECLARE master CURSOR FOR
EXEC SQL DECLARE detail CURSOR FOR FOR UPDATE
EXEC SQL OPEN master;
while(SQLCODE == 0)
{
EXEC SQL FETCH master INTO
if(SQLCODE == 0)
{
EXEC SQL BEGIN WORK;
EXEC SQL OPEN detail USING
EXEC SQL FETCH detail
EXEC SQL UPDATE WHERE CURRENT OF detail
EXEC SQL COMMIT WORK;
}
}
EXEC SQL CLOSE master;
在此设计中,
使用一个游标来扫描表。
选择了的记录用作更新不同的表的基础。
问题在于,
当将每一更新当做分开的事务处理时(如前一示例中伪代码所示),跟在 UPDATE 之后
的 COMMIT WORK 语句关闭所有游标,包括主游标。
最简单的替代方案是将 COMMIT WORK 语句和 BEGIN WORK 语句分别移到最后一个
语句和第一个语句, 这样,对整个主表的扫描就是一个大事务。将主表的扫描作为一个大
事务来处理,有时是可能的,但如果需要更新许多行,它可变得不现实。锁的数目可能太
大,并且在程序期间持有它们。
GBase 8s 数据库服务器支持的解决方案是将关键字 WITH HOLD 添加到主游标的声明。

用这样的游标作为持有游标,在不在事务结束时关闭。数据库服务器仍然关闭所有其他游
标,且它仍然释放所有锁,但持有游标保持打开,直到显式地关闭它为止。
在您尝试使用持有游标之前,您必须确保了解此处描述的锁定机制,且您还必须了解正在
并发地运行的程序。每当执行 COMMIT WORK 时,释放所有锁,包括放置在任何通过该
持有游标访存的行上的任何锁。
对于对表的单向扫描,如果如您所愿地使用游标,则锁的移除无关紧要。然而,您可为任
何游标指定 WITH HOLD,包括更新游标和滚动游标。在您这么做之前,您必须了解该事
实的含义,即,在事务结束时,释放所有锁(包括对整个表的锁)。


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

ifx_lo_writewithseek() 函数执行查找操作然后将数据写入到打开的智能大对象。
语法
ifx_lo_writewithseek(lofd, buf, offset, whence)
参数
该函数接受以下参数。
参数
类型
用于
描述
lofd
SQL_INTEGER
输入
智能大对象文件描述符
buf
SQL_CHAR
输入
包含函数写入到智能大对象中的数据的缓
冲区。该缓冲区的大小不能超过 2 千兆字
节。
offset
SQL_BIGINT
输入
起始查找位置的偏移量,以字节为单位。
使用 SQL_C_LONG 或 SQL_C_SHORT,
而不是使用缺省的 GBase 8s ODBC Driver
C 数据类型 SQL_C_CHAR 作为 offset。
whence
SQL_INTEGER
输入
开始查找位置。可能值为:
LO_SEEK_CUR
当前查找位置在智能大对象中的位置
LO_SEEK_END
智能大对象的末尾位置
LO_SEEK_SET
智能大对象的起始位置

用法

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 178 -

ifx_lo_writewithseek() 函数执行查找操作并将数据写入到自智能大对象。该写入从 offset
和 whence 参数指定的 lofd 查找位置开始。
ifx_lo_writewithseek() 函数写入 cbValueMax 字节数据。cbValueMax 是
SQLBindParameter() 和 SQLBindCol() 的一个输入参数。buf 或 cbValueMax 的大小不能
超过 2 GB。要写入大于 2 GB 的智能大对象,将它写入到 2-GB chunk。
ifx_lo_writewithseek() 函数从 buf 指向的用户定义的缓冲区获取数据。
如果 SQLExecDirect() 或 SQLExecute() 返回 SQL_SUCCESS_WITH_INFO,则数据库服
务器写入少于 cbValueMax 字节的数据到智能大对象,pcbValue(这些函数的一个参数)
包含函数写入的字节数。当 sbspace 超出空间范围时,发生此情况。

在 GBASE
® Data Server .NET Provider 和 GBase 8s .NET Provider 之间存在
运行时差异。了解这些差异有助于理解每个提供程序如何影响现有应用程序,
并选择适合您的应用程序的提供程序。
两种提供程序均可作为 GBase 8s 的 Client SDK (CSDK) 的一部分。
以下几节描述 .NET 提供程序之间的具体差异。