欢迎来到天天文库
浏览记录
ID:34753473
大小:58.52 KB
页数:8页
时间:2019-03-10
《在sqlserver存储过程中使用cursor(游标)操作记录》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1. 为何使用游标: 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQLserver内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。2. 如何使用游标: 一般地,使用游标都遵循下列的常规步骤: (1) 声明游标。把游标与T-SQL语句的结果集联系起来。 (2) 打开游标。 (3) 使用游标操作数据。 (4)
2、 关闭游标。 2.1. 声明游标 DECLARECURSOR语句SQL-92标准语法格式: DECLARE 游标名 [INSENSITIVE][SCROLL]CURSORFORsql-statementEg:DeclareMycrsrVarCursorFORSelect*FROMtbMyData2.2 打开游标 OPENMycrsrVar当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据: FETCHFIRSTfr
3、omE1cursor 或 FETCHNEXTfromE1cursor2.3 使用游标操作数据 下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动 DECLAREE1cursorcursor FORSELECT*FROMc_exampleOPENE1cursor FETCHNEXTfromE1cursor WHILE@@FETCH_STATUS=0 BEGIN FETCHNEXTfromE1cursor ENDC
4、LOSEE1cursor DEALLOCATEE1cursor 2.4 关闭游标 使用CLOSE语句关闭游标 CLOSE{{[GLOBAL] 游标名 }
5、 游标变量名 }使用DEALLOCATE语句删除游标,其语法格式如下: DEALLOCATE{{[GLOBAL] 游标名 }
6、@游标变量名 3.FETCH操作的简明语法如下: FETCH [NEXT
7、PRIOR
8、FIRST
9、LAST]FROM{ 游标名
10、@游标变量名 }[INTO@变量名 [
11、,…]]参数说明: NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCHNEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。 INTO@变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。 -------------------------------
12、-------------------------------------------------------------------------------------------------每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值: ·0 表示成功执行FETCH语句。 ·-1 表示FETCH语句失败,例如移动行指针使其超出了结果集。 ·-2 表示被提取的行不存在。 由于@@FETCH_STATU是全局变量,在一个连接上
13、的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。SETNOCOUNTON DECLARE@au_idvarchar(11),@au_fnamevarchar(20),@au_lnamevarchar(40), @messagevarchar(80),@titlevarchar(80) PRINT"--------UtahAuthorsreport--------"
14、DECLAREauthors_cursorCURSORFORSELECTau_id,au_fname,au_lnameFROMauthorsWHEREstate="UT"ORDERBYau_id OPENauthors_cursor FETCHNEXTFROMauthors_cursorI
此文档下载收益归作者所有