SlideShare ist ein Scribd-Unternehmen logo
1 von 10
※4.4 游标
※每课一练
4.4.1 游标概念
    SQL Server 通过游标提供了对一个结果集进行逐行处理的能力,游标可看做
一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对
指定位置的数据进行处理。使用游标可以在查询数据的同时对数据进行处理。
    在 SQL Server 中,有两类游标可以用于应用程序中:前端(客户端)游标和
后端(服务器端)游标。服务器端游标是由数据库服务器创建和管理的游标,而客
户端游标是由 ODBC 和 DB-Library 支持,在客户端实现的游标。
    在客户端游标中,所有的游标操作都在客户端高速缓存中执行。最初实现
DB-Library 客户端游标时 SQL Server 尚不支持服务器游标,而 ODBC 客户端游标
是为了用于仅支持游标特性默认设置的 ODBC 驱动程序。由于 DB-Library 和 SQL
Server ODBC 驱动程序完全支持通过服务器游标的游标操作,所以应尽量不使用客
户端游标。 SQL Sever 2005 中对客户端游标的支持也主要是考虑向后兼容。本节
除非特别指明,所说的游标均为服务器游标。
    SQL Server 对游标的使用要遵循:声明游标→打开游标→读取数据→关闭游
标→删除游标。
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
  该语句定义的游标与单个表的查询结果集相关联,是只读的,游标只能从头到
尾顺序提取数据,相当于下面所讲的只进游标。
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 总学分
声明游标后,要使用游标从中提取数据,就必须先打开游标。在 T-SQL 中,
使用 OPEN 语句打开游标,其格式为:
   OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
    其中, cursor_name 是要打开的游标名, cursor_variable_name 是游标变
量名,该名称引用一个游标。 GLOBAL 说明打开的是全局游标,否则打开局部
游标。
    OPEN 语句打开游标,然后通过执行在 DECLARE CURSOR (或 SET
cursor_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
游标打开后,就可以使用 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_CUR2
FETCH FIRST FROM XS_CUR2
- 读取游标第一行(当前行为第一行),结果如下所示:
FETCH NEXT FROM XS_CUR2
读取下一行(当前行为第二行),结果如下所示:


FETCH PRIOR FROM XS_CUR2
读取上一行(当前行为第一行),结果如下所示:


FETCH LAST FROM XS_CUR2
读取最后一行(当前行为最后一行),结果如下所示:


FETCH RELATIVE -2 FROM XS_CUR2
读取当前行的上二行(当前行为倒数第一行),结果如下所示:
游标使用完以后,要及时关闭。关闭游标使用 CLOSE 语句,格式为:
CLOSE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
语句参数的含义与 OPEN 语句中相同。例如:
CLOSE XS_CUR2
将关闭游标 XS_CUR2 。
游标关闭后,其定义仍在,需要时可用 OPEN 语句打开它再使用。若确认
游标不再需要,就要释放其定义占用的系统空间,即删除游标。删除游标使用
DEALLOCATE 语句,格式为:
  DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
  语句参数的含义与 OPEN 和 CLOSE 语句中相同。例如:
  DEALLOCATE XS_CUR2
  将删除游标 XS_CUR2 。
每课一练
   实验一:使用游标
    实验要求:打开查询分析器,首先声明一个游标 syb,
    要求返回表“ Suppliers” 中“联系人职
    务”为“ Sales Manager” 的供应商,且该游标允许前
    后滚动和修改;然后打开该游标;第三步对该游标所指
    定的记录进行修改,将其中国家为“ Denmark” 记录的
    “邮编”由原来的“ 2800” 改为“ DK2800” ;然后关
    闭该游标并删除该游标。该过程在查询分析器中调试成
    功后,将上述程序过程以“ cc2” 为名,做为存储过程
    保存在数据库 sales 中。

Weitere ähnliche Inhalte

Andere mochten auch (8)

Keynote technicals Intraday levels
Keynote technicals Intraday levelsKeynote technicals Intraday levels
Keynote technicals Intraday levels
 
魅力客服(八)言語的力量
魅力客服(八)言語的力量魅力客服(八)言語的力量
魅力客服(八)言語的力量
 
Enciclopedia De La PedagogìA Kem
Enciclopedia De La PedagogìA KemEnciclopedia De La PedagogìA Kem
Enciclopedia De La PedagogìA Kem
 
The infinite possibilities of CRM: save money, save time, and engage
The infinite possibilities of CRM: save money, save time, and engageThe infinite possibilities of CRM: save money, save time, and engage
The infinite possibilities of CRM: save money, save time, and engage
 
Presentacion Csi Cprimaria
Presentacion Csi CprimariaPresentacion Csi Cprimaria
Presentacion Csi Cprimaria
 
Flores del mundo
Flores del mundoFlores del mundo
Flores del mundo
 
魅力客服(八)言語的力量
魅力客服(八)言語的力量魅力客服(八)言語的力量
魅力客服(八)言語的力量
 
Edi
EdiEdi
Edi
 

Ähnlich wie 11

第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
hanmo1988
 
Oracle公司内部数据库培训资料
Oracle公司内部数据库培训资料Oracle公司内部数据库培训资料
Oracle公司内部数据库培训资料
yiditushe
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解
leeley2000
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
pwesh
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler API
Lixun Peng
 
第6章 数据查询
第6章 数据查询第6章 数据查询
第6章 数据查询
hanmo1988
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
yiditushe
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
yiditushe
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
maclean liu
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获
maclean liu
 
Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期
yiditushe
 
3小时 快速了解postgre sql
3小时 快速了解postgre sql3小时 快速了解postgre sql
3小时 快速了解postgre sql
Michael Fan
 

Ähnlich wie 11 (20)

6
66
6
 
第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
 
FMDB 研究
FMDB 研究FMDB 研究
FMDB 研究
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
Oracle公司内部数据库培训资料
Oracle公司内部数据库培训资料Oracle公司内部数据库培训资料
Oracle公司内部数据库培训资料
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
12
1212
12
 
4
44
4
 
MySQL源码分析.02.Handler API
MySQL源码分析.02.Handler APIMySQL源码分析.02.Handler API
MySQL源码分析.02.Handler API
 
第6章 数据查询
第6章 数据查询第6章 数据查询
第6章 数据查询
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程
 
Sql语句的优化
Sql语句的优化Sql语句的优化
Sql语句的优化
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获
 
Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期
 
3小时 快速了解postgre sql
3小时 快速了解postgre sql3小时 快速了解postgre sql
3小时 快速了解postgre sql
 

Mehr von xiliangxiliang (8)

10
1010
10
 
9
99
9
 
7
77
7
 
5
55
5
 
3
33
3
 
2
22
2
 
1
11
1
 
10
1010
10
 

11

  • 2. 4.4.1 游标概念 SQL Server 通过游标提供了对一个结果集进行逐行处理的能力,游标可看做 一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对 指定位置的数据进行处理。使用游标可以在查询数据的同时对数据进行处理。 在 SQL Server 中,有两类游标可以用于应用程序中:前端(客户端)游标和 后端(服务器端)游标。服务器端游标是由数据库服务器创建和管理的游标,而客 户端游标是由 ODBC 和 DB-Library 支持,在客户端实现的游标。 在客户端游标中,所有的游标操作都在客户端高速缓存中执行。最初实现 DB-Library 客户端游标时 SQL Server 尚不支持服务器游标,而 ODBC 客户端游标 是为了用于仅支持游标特性默认设置的 ODBC 驱动程序。由于 DB-Library 和 SQL Server ODBC 驱动程序完全支持通过服务器游标的游标操作,所以应尽量不使用客 户端游标。 SQL Sever 2005 中对客户端游标的支持也主要是考虑向后兼容。本节 除非特别指明,所说的游标均为服务器游标。 SQL Server 对游标的使用要遵循:声明游标→打开游标→读取数据→关闭游 标→删除游标。
  • 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. 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. 声明游标后,要使用游标从中提取数据,就必须先打开游标。在 T-SQL 中, 使用 OPEN 语句打开游标,其格式为: OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name } 其中, cursor_name 是要打开的游标名, cursor_variable_name 是游标变 量名,该名称引用一个游标。 GLOBAL 说明打开的是全局游标,否则打开局部 游标。 OPEN 语句打开游标,然后通过执行在 DECLARE CURSOR (或 SET cursor_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. 游标打开后,就可以使用 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_CUR2 FETCH FIRST FROM XS_CUR2 - 读取游标第一行(当前行为第一行),结果如下所示:
  • 7. FETCH NEXT FROM XS_CUR2 读取下一行(当前行为第二行),结果如下所示: FETCH PRIOR FROM XS_CUR2 读取上一行(当前行为第一行),结果如下所示: FETCH LAST FROM XS_CUR2 读取最后一行(当前行为最后一行),结果如下所示: FETCH RELATIVE -2 FROM XS_CUR2 读取当前行的上二行(当前行为倒数第一行),结果如下所示:
  • 8. 游标使用完以后,要及时关闭。关闭游标使用 CLOSE 语句,格式为: CLOSE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 语句参数的含义与 OPEN 语句中相同。例如: CLOSE XS_CUR2 将关闭游标 XS_CUR2 。
  • 9. 游标关闭后,其定义仍在,需要时可用 OPEN 语句打开它再使用。若确认 游标不再需要,就要释放其定义占用的系统空间,即删除游标。删除游标使用 DEALLOCATE 语句,格式为: DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 语句参数的含义与 OPEN 和 CLOSE 语句中相同。例如: DEALLOCATE XS_CUR2 将删除游标 XS_CUR2 。
  • 10. 每课一练  实验一:使用游标 实验要求:打开查询分析器,首先声明一个游标 syb, 要求返回表“ Suppliers” 中“联系人职 务”为“ Sales Manager” 的供应商,且该游标允许前 后滚动和修改;然后打开该游标;第三步对该游标所指 定的记录进行修改,将其中国家为“ Denmark” 记录的 “邮编”由原来的“ 2800” 改为“ DK2800” ;然后关 闭该游标并删除该游标。该过程在查询分析器中调试成 功后,将上述程序过程以“ cc2” 为名,做为存储过程 保存在数据库 sales 中。