由键集驱动的游标

此由键集驱动的游标在其检测更改的功能方面介于静态和动态游标之间。 比如静态游标,它不会始终检测对结果集的成员身份和顺序的更改。 与动态游标一样,它会检测结果集中行值的更改(受事务的隔离级别约束,由 SQL_ATTR_TXN_ISOLATION 连接属性设置)。

打开由键集驱动的游标时,它将保存整个结果集的键;这将修复结果集的明显成员身份和顺序。 当游标滚动浏览结果集时,它使用此键集中的键检索每行的当前数据值。 例如,假定由键集驱动的游标提取行,然后另一个应用程序将更新该行。 如果游标重新提取行,则它看到的值是新行,因为它使用其键重新提取了该行。 因此,由键集驱动的游标始终检测自己和其他项所做的更改。

当游标尝试检索已删除的行时,此行在结果集中显示为“缺口”:该行的键存在于键集中,但该行不再存在于结果集中。 如果一行中的键值有所更新,该行会被视为已删除,然后是已插入,因此这样的行在结果集中也显示为缺口。 由键集驱动的游标始终可以检测由其他项删除的行,但它也可以选择性地移除它自己从键集中删除的行键。 执行此操作的由键集驱动的游标无法检测自己删除的行。 特定的由键集驱动游标是否检测其自己的删除项在 SQLGetInfo 中通过 SQL_STATIC_SENSITIVITY 选项报告。

其他项插入的行永远不会对由键集驱动的游标可见,因为键集中不存在这些行的键。 但是,由键集驱动的游标可以选择将它自己插入的行的键添加到键集中。 执行此操作的由键集驱动的游标可以检测自己插入的行。 特定的由键集驱动的游标是否检测其自己的插入项在 SQLGetInfo 中通过 SQL_STATIC_SENSITIVITY 选项报告。

由 SQL_ATTR_ROW_STATUS_PTR 语句属性指定的行状态数组可以包含任何行的 SQL_ROW_SUCCESS、SQL_ROW_SUCCESS_WITH_INFO 或 SQL_ROW_ERROR。 对于检测到已更新、已删除或已插入的行,它返回 SQL_ROW_UPDATED、SQL_ROW_DELETED 或 SQL_ROW_ADDED。

由键集驱动的游标通常通过创建一个临时表来实现,该临时表包含结果集中每一行的键。 由于游标还必须确定行是否已更新,因此此表通常还包含带有行版本控制信息的列。

要滚动到原始结果集,由键集驱动的游标将在临时表上打开静态游标。 要检索原始结果集中的行,游标首先从临时表中检索相应的键,然后检索该行的当前值。 如果使用块游标,游标必须检索多个键和行。