什么是游标?

关系数据库中的操作对一组完整的行进行操作。 SELECT 语句返回的行集由满足语句 WHERE 子句中条件的所有行组成。 返回语句的这组完整行称为结果集。 应用程序(尤其是交互式和联机的应用程序)不能始终以单元的形式有效处理整个结果集。 这些应用程序需要一种机制来一次处理一行或一小段行。 游标是提供该机制的结果集的扩展。

游标由游标库实现。 游标库是软件,通常作为数据库系统的一部分或数据访问 API 实现,用于管理从数据源返回的数据的属性(结果集)。 这些属性包括并发管理、结果集中的位置、返回的行数,以及是否可以向前或向后移动(或同时移动)通过结果集(可滚动性)。

游标可跟踪结果集中的位置,并允许针对结果集逐行执行多个操作,且不返回原始表。 换句话说,游标在概念上基于数据库中的表返回结果集。 光标之所以命名,是因为它指示结果集中的当前位置,就像计算机屏幕上的光标指示当前位置一样。

在继续学习 ADO 中的用法细节之前,请务必熟悉游标的概念。

使用游标,可以:

  • 在结果集中指定某些行的位置。

  • 根据当前结果集位置检索一行或一个行块。

  • 修改结果集中当前位置的行中的数据。

  • 定义对其他用户所做的数据更改的不同敏感度。

例如,考虑向潜在买家显示可用产品列表的应用程序。 买家滚动浏览列表以查看产品详细信息和成本,最后选择要购买的产品。 其他滚动和选择发生在列表的其余部分。 对于购买者来说,产品一次仅显示一个,但应用程序使用可滚动的游标上下浏览结果集。

可以通过多种方式使用游标:

  • 根本没有行。

  • 在单个表中包含部分或全部行。

  • 包含逻辑联接表中的部分或全部行。

  • 在游标或字段级别,可以是只读状态,也可以是可更新状态。

  • 仅向前滚动或完全可滚动。

  • 游标键集位于服务器上。

  • 对其他应用程序(例如成员身份、排序、插入、更新和删除)造成的基础表更改敏感。

  • 存在于服务器或客户端上。

只读游标可帮助用户浏览结果集,读/写游标可以实现单个行更新。 可以使用指向基表行的键集定义复杂的游标。 尽管某些游标只能向前读,但其他游标可以前后移动,并根据其他应用程序对数据库所做更改提供结果集的动态刷新。

并非所有应用程序都需要使用游标来访问或更新数据。 某些查询根本不需要使用游标进行直接行更新。 游标应是你选择检索数据的最后一种方法之一,然后应该选择可能的最低影响游标。 使用存储过程创建结果集时,使用游标编辑或更新方法无法更新结果集。

并发

在某些多用户应用程序中,向最终用户呈现的数据尽可能最新非常重要。 此类系统的经典示例是航空公司预订系统,许多用户可能争用给定航班上的同一座位(因此,单个记录)。 在这种情况下,应用程序设计必须处理单个记录上的并发操作。

在其他应用程序中,并发并不那么重要。 在这种情况下,始终保持数据最新所涉及的费用是不合理的。

位置

游标还会跟踪结果集中的当前位置。 将光标位置视为指向当前记录的指针,类似于数组索引指向数组中该特定位置的值的方式。

可滚动性

应用程序使用的游标类型还会影响在结果集中的行中向前和向后移动的能力;这有时称为可滚动性。 通过结果集向前移动 的能力增加了游标的复杂性,因此实现成本更高。 出于此原因,应仅在必要时请求具有此功能的游标。