转自:http://blog.csdn.net/chinajiyong/article/details/7280699
再来看看MSSQL中的游标。
我们知道所有SQL语句都在行集上运行。SELECT语句返回包含所有满足SELECT语句限定条件的行的完整结果集。应用程序需要一次处理结果集的一行或一个行块。游标是结果集的逻辑扩展,它使应用程序得以逐行处理结果集。SQL SERVER支持多种指定游标的机制:
1、Transact-SQL支持用于管理游标的SQL-92 DECLARE CURSOR、OPEN、FETCH 和CLOSE语句。Transact-SQL还支持游标扩展,如:
(1)、允许对重新使用游标进行优化的DEALLOCATE语句。//删除游标
(2)、定义Transact-SQL变量以具有游标数据类型,然后用它引用游标。
(3)、定义具有局部或全局作用域的游标。
(4)、在DECLARE CURSOR 语句内指定符合OLE DB和ODBC规范的游标类型(FORWARD_ONLY、STATIC、KEYSET和 DYNAMIC)。
2、用于SQL Server的Microsoft OLE DB 提供程序支持ADO和OLE DB API的游标功能。
3、Microsoft SQL Server ODBC驱动程序支持ODBC、RDO、DAO和Microsoft基础类数据库类API的游标功能。
4、用于C语言的Microsoft嵌入式SQL支持嵌入式SQL标准的游标功能。
5、DB-Library API支持与OLE DB和ODBC API相同级别的游标功能。
- 首先,我们创建一个银行信息表
- IF OBJECT_ID('bankInfo') IS NOT NULL
- DROP TABLE bankInfo
- GO
- --银行卡信息表
- CREATE TABLE bankInfo
- (
- uId VARCHAR(18) NOT NULL PRIMARY KEY,--卡号
- uName VARCHAR(20), --卡主姓名
- uMoney MONEY --卡中余额
- )
- GO
- INSERT INTO bankInfo VALUES('9559901','张三',1)
- INSERT INTO bankInfo VALUES('9559902','李四',1000)
- INSERT INTO bankInfo VALUES('9559903','王五',800)
- INSERT INTO bankInfo VALUES('9559904','赵六',50)
- INSERT INTO bankInfo VALUES('9559905','赵明',5)
- SELECT * FROM bankInfo,结果显示如下:
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559901 张三 1.00
- 9559902 李四 1000.00
- 9559903 王五 800.00
- 9559904 赵六 50.00
- 9559905 赵明 5.00
- (5 行受影响)
- */
- <span style="font-size:16px; ">创建了游标之后,必须要打开才能使用,还是用T-SQL举个示例来说明一下游标的使用</span>
- -----------游标的使用----------------
- DEALLOCATE CursorBank --删除游标
- GO
- --------定义游标-----------------
- DECLARE CursorBank CURSOR SCROLL
- FOR SELECT * FROM bankInfo
- GO
- OPEN CursorBank --从游标读取数据前必须先打开游标
- FETCH FIRST FROM CursorBank --读取第一行
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559901 张三 401.00
- (1 行受影响)
- */
- FETCH NEXT FROM CursorBank --上次读取行的下一行
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559902 李四 600.00
- (1 行受影响)
- */
- FETCH PRIOR FROM CursorBank --上次读取行的上一行
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559901 张三 401.00
- (1 行受影响)
- */
- FETCH LAST FROM CursorBank --最后一行
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559905 赵明 5.00
- (1 行受影响)
- */
- FETCH ABSOLUTE 2 FROM CursorBank --定位到第三行
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559902 李四 600.00
- (1 行受影响)
- */
- FETCH RELATIVE -1 FROM CursorBank --相对位置定位,根据当前游标位置
- /*
- uId uName uMoney
- ------------------ -------------------- ---------------------
- 9559901 张三 401.00
- (1 行受影响)
- */
--通过游标读取数据,如果余额大于等于500,
--则显示该储户为贵宾客户
--全局变量@@FETCH_STATUS表示上一个FETCH是否读取
--到了数据,其返回值类型为int型
-- 值有三种:
-- 0 : FETCH语句成功
-- -1 : FETCH语句失败或此行不在结果集中
-- -2 : 被提取行不存在
sql语句如下:
- DECLARE @id VARCHAR(12),@name VARCHAR(20)
- DECLARE @getMoney MONEY
- FETCH FIRST FROM CursorBank INTO @id,@name,@getMoney
- WHILE @@FETCH_STATUS=0 --上一个fetch是否读取到了数据
- BEGIN
- IF(@getMoney>500)
- PRINT '你是VIP用户'+',账号:'+@id+',姓名:'+@name+',账户余额:'+CONVERT(VARCHAR(12),@getMoney)
- ELSE
- PRINT @name+',您不是VIP用户!'
- FETCH NEXT FROM CursorBank INTO @id,@name,@getMoney
- END
- 运行结果如下:
- /*
- 张三,您不是VIP用户!
- 你是VIP用户,账号:9559902,姓名:李四,账户余额:600.00
- 你是VIP用户,账号:9559903,姓名:王五,账户余额:800.00
- 赵六,您不是VIP用户!
- 赵明,您不是VIP用户!
- */