SQL 游标

Posted 我来乔23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 游标相关的知识,希望对你有一定的参考价值。

  什么是游标(Cursor)?

  关系数据库中的操作会对整个行集起作用。 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。 这种由语句返回的完整行集称为结果集。 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。 这些应用程序需要一种机制以便每次处理一行或一部分行

   游标就是提供这种机制的对结果集的一种扩展。

  游标通过以下方式来扩展结果处理:

  • 允许定位在结果集的特定行

  • 从结果集的当前位置检索一行或一部分行

  • 支持对结果集中当前位置的行进行数据修改

  • 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持

  • 提供脚本、存储过程和触发器中用于访问结果集中的数据的 Transact-SQL 语句

  

  游标实现
  SQL Server 支持三种游标实现。

  Transact-SQL 游标
  基于 DECLARE CURSOR 语法,主要用于 Transact-SQL 脚本、存储过程和触发器中。 Transact-SQL 游标在服务器上实现,由从客户端发送到服务器的 Transact-SQL 语句管理。 它们还可能包含在批处理、存储过程或触发器中。

  应用程序编程接口 (API) 服务器游标
  支持 OLE DB 和 ODBC 中的 API 游标函数。 API 服务器游标在服务器上实现。 每次客户端应用程序调用 API 游标函数时, SQL Server Native Client OLE DB 访问接口或 ODBC 驱动程序会把请求传输到服务器,以便对 API 服务器游标进行操作。

  客户端游标
  由 SQL Server Native Client ODBC 驱动程序和实现 ADO API 的 DLL 在内部实现。 客户端游标通过在客户端高速缓存所有结果集行来实现。 每次客户端应用程序调用 API 游标函数时, SQL Server Native Client ODBC 驱动程序或 ADO DLL 会对客户端上高速缓存的结果集行执行游标操作。

  游标类型
  只进
  只进游标不支持滚动,它只支持游标从头到尾顺序提取。 行只在从数据库中提取出来后才能检索。 对所有由当前用户发出或由其他用户提交、并影响结果集中的行的 INSERT、UPDATE 和 DELETE 语句,其效果在这些行从游标中提取时是可见的。

  由于游标无法向后滚动,则在提取行后对数据库中的行进行的大多数更改通过游标均不可见。 当值用于确定所修改的结果集(例如更新聚集索引涵盖的列)中行的位置时,修改后的值通过游标可见。

  尽管数据库 API 游标模型将只进游标视为一种游标类型,但是 SQL Server 不这样。 SQL Server 将只进和滚动视为可应用于静态游标、键集驱动游标和动态游标的选项。 Transact-SQL 游标支持只进静态游标、键集驱动游标和动态游标。 数据库 API 游标模型则假定静态游标、键集驱动游标和动态游标都是可滚动的。 当数据库 API 游标属性设置为只进时, SQL Server 将此游标作为只进动态游标实现。

  静态
  静态游标的完整结果集是打开游标时在 tempdb 中生成的。 静态游标总是按照打开游标时的原样显示结果集。静态游标在滚动期间很少或根本检测不到变化,但消耗的资源相对很少。

  游标不反映在数据库中所做的任何影响结果集成员身份的更改,也不反映对组成结果集的行的列值所做的更改。 静态游标不会显示打开游标以后在数据库中新插入的行,即使这些行符合游标 SELECT 语句的搜索条件。如果组成结果集的行被其他用户更新,则新的数据值不会显示在静态游标中。 静态游标会显示打开游标以后从数据库中删除的行。 静态游标中不反映 UPDATE、INSERT 或者 DELETE 操作(除非关闭游标然后重新打开),甚至不反映使用打开游标的同一连接所做的修改。








以上是关于SQL 游标的主要内容,如果未能解决你的问题,请参考以下文章

sql 游标如何循环

sql server 中游标详解

Oracle下如何用sql创建游标

Sql中的游标是干嘛的

游标和动态SQL

如何使用Oracle的游标?