Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

11

256 views

Published on

by xiliang

Published in: Education
  • Be the first to comment

  • Be the first to like this

11

  1. 1. ※4.4 游标※每课一练
  2. 2. 4.4.1 游标概念 SQL Server 通过游标提供了对一个结果集进行逐行处理的能力,游标可看做一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理。使用游标可以在查询数据的同时对数据进行处理。 在 SQL Server 中,有两类游标可以用于应用程序中:前端(客户端)游标和后端(服务器端)游标。服务器端游标是由数据库服务器创建和管理的游标,而客户端游标是由 ODBC 和 DB-Library 支持,在客户端实现的游标。 在客户端游标中,所有的游标操作都在客户端高速缓存中执行。最初实现DB-Library 客户端游标时 SQL Server 尚不支持服务器游标,而 ODBC 客户端游标是为了用于仅支持游标特性默认设置的 ODBC 驱动程序。由于 DB-Library 和 SQLServer ODBC 驱动程序完全支持通过服务器游标的游标操作,所以应尽量不使用客户端游标。 SQL Sever 2005 中对客户端游标的支持也主要是考虑向后兼容。本节除非特别指明,所说的游标均为服务器游标。 SQL Server 对游标的使用要遵循:声明游标→打开游标→读取数据→关闭游标→删除游标。
  3. 3. 1 . SQL-92 语法 语句格式: DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] 以下是一个符合 SQL-92 标准的游标声明: DECLARE XS_CUR1 CURSOR FOR SELECT 学号 , 姓名 , 性别 , 出生时间 , 总学分 FROM XSB WHERE 专业 = 计算机 FOR READ ONLY 该语句定义的游标与单个表的查询结果集相关联,是只读的,游标只能从头到尾顺序提取数据,相当于下面所讲的只进游标。
  4. 4. 2 . T-SQL 扩展语句格式:DECLARE cursor_name CURSOR[ LOCAL | GLOBAL ] /* 游标作用域 */[ FORWORD_ONLY | SCROLL ] /* 游标移动方向 */[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] /* 游标类型 */[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] /* 访问属性 */[ TYPE_WARNING ] /* 类型转换警告信息 */FOR select_statement /*SELECT 查询语句 */[ FOR UPDATE [ OF column_name [ ,…n ] ] ] /* 可修改的列 */[;]以下是一个 T-SQL 扩展游标声明:DECLARE XS_CUR2 CURSOR DYNAMIC FOR SELECT 学号 , 姓名 , 总学分 FROM XSB WHERE 专业 = 计算机 FOR UPDATE OF 总学分
  5. 5. 声明游标后,要使用游标从中提取数据,就必须先打开游标。在 T-SQL 中,使用 OPEN 语句打开游标,其格式为: OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name } 其中, cursor_name 是要打开的游标名, cursor_variable_name 是游标变量名,该名称引用一个游标。 GLOBAL 说明打开的是全局游标,否则打开局部游标。 OPEN 语句打开游标,然后通过执行在 DECLARE CURSOR (或 SETcursor_variable )语句中指定的 T-SQL 语句填充游标(即生成与游标相关联的结果集)。 例如,语句: OPEN XS_CUR1 【例 4.85 】 定义游标 XS_CUR3 ,然后打开该游标,输出其行数。 DECLARE XS_CUR3 CURSOR LOCAL SCROLL SCROLL_LOCKS FOR SELECT 学号 , 姓名 , 总学分 FROM XSB FOR UPDATE OF 总学分 OPEN XS_CUR3 SELECT 游标 XS_CUR3 数据行数 = @@CURSOR_ROWS
  6. 6. 游标打开后,就可以使用 FETCH 语句从中读取数据。语法格式:FETCH[ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar} ] FROM ]{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }[ INTO @variable_name [ ,…n ] ]【例 4.86 】 从游标 XS_CUR1 中提取数据。设该游标已经声明并打开。FETCH NEXT FROM XS_CUR1执行结果如下所示:【例 4.87 】 从游标 XS_CUR2 中提取数据。设该游标已经声明。OPEN XS_CUR2FETCH FIRST FROM XS_CUR2- 读取游标第一行(当前行为第一行),结果如下所示:
  7. 7. FETCH NEXT FROM XS_CUR2读取下一行(当前行为第二行),结果如下所示:FETCH PRIOR FROM XS_CUR2读取上一行(当前行为第一行),结果如下所示:FETCH LAST FROM XS_CUR2读取最后一行(当前行为最后一行),结果如下所示:FETCH RELATIVE -2 FROM XS_CUR2读取当前行的上二行(当前行为倒数第一行),结果如下所示:
  8. 8. 游标使用完以后,要及时关闭。关闭游标使用 CLOSE 语句,格式为:CLOSE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }语句参数的含义与 OPEN 语句中相同。例如:CLOSE XS_CUR2将关闭游标 XS_CUR2 。
  9. 9. 游标关闭后,其定义仍在,需要时可用 OPEN 语句打开它再使用。若确认游标不再需要,就要释放其定义占用的系统空间,即删除游标。删除游标使用DEALLOCATE 语句,格式为: DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 语句参数的含义与 OPEN 和 CLOSE 语句中相同。例如: DEALLOCATE XS_CUR2 将删除游标 XS_CUR2 。
  10. 10. 每课一练 实验一:使用游标 实验要求:打开查询分析器,首先声明一个游标 syb, 要求返回表“ Suppliers” 中“联系人职 务”为“ Sales Manager” 的供应商,且该游标允许前 后滚动和修改;然后打开该游标;第三步对该游标所指 定的记录进行修改,将其中国家为“ Denmark” 记录的 “邮编”由原来的“ 2800” 改为“ DK2800” ;然后关 闭该游标并删除该游标。该过程在查询分析器中调试成 功后,将上述程序过程以“ cc2” 为名,做为存储过程 保存在数据库 sales 中。

×