
_START_ARTICLE_
指標 (資料庫)
_START_PARAGRAPH_
数据指针(Data Cursor) 或称光标，是在数据库引擎(Database Engine)中，让开发人员或数据库管理员可以遍历、浏览检索结果的数据列(称为数据查询结果集, Result set)，是主要用于在结果集中移动到某一数据列(row)的控制结构。光标可以被看作是指向一组列中，代表某一列的指针。光标一次只能引用一列，但可以根据需要移动到结果集的其他列。_NEWLINE_光标有助于随检索之后的数据处理与遍历相结合，如添加和删除记录。它能遍历数据查询结果集的特性，类似于编程语言的迭代器概念。开发程序人员通常依需求而使用光标，来处理由数据库系统查询返回的整个结果集。在这种情况下，光标可使结果集中的数据列依照次序处理。在SQL程序中，使用光标可以定义检索集（多行数据列的条件选取组合）并逐行运行数据处理的逻辑。通过相同的机制，SQL程序也可将结果集直接返回给调用者或客户端应用程序；也常会被外部的数据访问接口所使用，像是ADO、JDBC、 ADO.NET、PL-SQL 等都有数据指针的应用。
_START_SECTION_
原理
_START_PARAGRAPH_
数据指针是在数据库产生结果集时，由数据库引擎所产生的一个指针，用来指示当前正在访问的结果集的位置，经由这个指针，可以得到结果集中的数据列，并且可以依照需求来移动，但由于指针会占用服务器的资源，并且在指针打开期间会激活共享锁定(Shared Lock)，在多人使用的系统中容易造成死锁的问题，因此当前大部分的应用程序都是使用仅前移型指针(Forward-Only Cursor)。
_START_SECTION_
种类
_START_PARAGRAPH_
依照功能来区分，有四种。
_START_SECTION_
静态指针
_START_PARAGRAPH_
静态指针(Static Cursor) 是利用暂存数据表作为存储结果集空间的一种指针，它可以让应用程序可以快速的访问结果集，但在静态指针打开期间，任何对数据表所做的变更都不会反映在结果集中；同时，在静态指针中所作的修改，无法反映到数据库中，此种指针是消耗资源度第三的指针。
_START_SECTION_
动态指针
_START_PARAGRAPH_
动态指针(Dynamic Cursor) 是可以反映数据库中修改的一种指针，不过它并不会让结果集的位置固定(随机变动)，因此无法确实的以指针位置来判断数据，并且它因为要随时反映数据库的变化，因此服务器需要消耗较多的资源，此种指针是消耗资源第二高的指针。
_START_SECTION_
索引键集型指针
_START_PARAGRAPH_
索引键集指针(Keyset Cursor) 是动态指针的强化版本，借由维护一个数据集位置对应表(以 SQL Server 为例，会创建在tempdb 的 keyset 数据表中)，以维护在结果集中的顺序不受更新而变化，但这相对的也付出了服务器性能和资源消耗的代价，因此索引键集指针是最消耗服务器资源的一种指针，在实务上应避免使用。
_START_SECTION_
仅前移型指针
_START_PARAGRAPH_
仅前移型指针(Forward-Only Cursor) 是一旦将指针往前移时，其走过的指针之前的结果集就会被舍弃，因此应用程序不能再往后移动指针，但也因此让服务器只需要记住指针在结果集中当前的位置即可，这让它消耗的资源只有指针而已，是最省资源的一种指针，在实务中被广泛使用，像 ADO.NET 的 DataReader 就只限定只能使用Forward-Only Cursor。
_START_SECTION_
可滚动或不可滚动
_START_PARAGRAPH_
数据库指针又分为可滚动性(scrollable cursor) 指针与不可滚动性指针，可滚动性指针代表数据库指针可以依据指针的操作指令来移动，像是向前(NEXT)、向后(BACK)、朝指定位置移动等等性质。此种指针在运行数据库复制(Replication) 时，是一个相当重要的能力，但可滚动性指针又会比不可滚动性指针消耗更多的资源。