游标:实质是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
游标主要是由结果集和游标位置组成的,结果集是SELECT语句执行后返回的,而游标指向返回的结果集的指针。

使用DECLARE cursor_name[LOCAL|GLOBAL]
[FORWARD_ONLY|SCROLL] [STATIC|KEYSET|DYNAMIC|FAST_FORWARD]
[READ_ONLY|SCROLL_LOCKS|OPTIMISTIC]
FOR select_statement

cursor_name:指定要声明游标的名称
select_statement:指定游标所用结果集的SELECT语句

Demo 01:

DECLARE cursor_users CURSOR
FOR SELECT * FROM Users;
--打开游标:执行OPEN语句的过程中,按照SELECT语句填充数据,当打开游标后,游标的位置在数据集的第一行
OPEN cursor_users;
--读取游标中的数据
FETCH NEXT FROM cursor_users --移动游标指针,执行结果集的行记录
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM cursor_users
END
--关闭游标
CLOSE cursor_users
--释放游标
DEALLOCATE cursor_users

使用游标读取数据,将记录中的字段内容取出存放在变量中:

定义游标对象:

DECLARE @qq INT,@nickname VARCHAR(50),@qqNum INT
SET @qqNum=10030

DECLARE cs_users CURSOR   --只进游标
FOR SELECT qq,nickname FROM Users WHERE qq>@qqNum

使用游标读取数据:

OPEN cs_users --打开游标
--读取游标数据
FETCH NEXT FROM cs_users INTO @qq,@nickname
PRINT '账号'+'   昵称'
WHILE @@FETCH_STATUS=0  --判断是否已移动到游标末端
BEGIN
  PRINT CAST(@qq AS VARCHAR)+' '+@nickname
  FETCH NEXT FROM cs_users INTO @qq,@nickname --将游标读取到的字段数据按顺序赋值到变量中
END

Demo 02:
定义游标;更改指定用户的密码

DECLARE @sname VARCHAR(50),@name VARCHAR(50)
SELECT @name='周润发'
DECLARE cursor_update CURSOR
FOR SELECT nickname FROM Users

OPEN cursor_update --打开游标

读取游标中的数据:

FETCH NEXT FROM cursor_update INTO @sname
WHILE @sname<>@name AND @@FETCH_STATUS=0
BEGIN
   FETCH NEXT FROM  cursor_update INTO @sname
   IF @sname=@name
BEGIN
 UPDATE Users SET pwd='zrf8955ui' WHERE nickname=@name
 BREAK --退出当前循环体:END关键字后面的任何语句将继续执行,
 --如果使用RETURN是直接退出程序,返回到上一个调用它的程序(通常应在存储过程、自定义函数)---返回到被调用处
END
END

SELECT * FROM Users WHERE nickname='周润发'

--关闭游标
CLOSE cursor_update
--释放游标
DEALLOCATE cursor_update

声明游标对象(只进游标(FORWARD_ONLY)–默认不加修饰的就是只进游标、静态游标(STATIC)、
–动态游标(DYNAMIC)、滚动游标(SCROLL))
–游标可以移动的方向
–只进游标:NEXT 向前
–静态游标:NEXT 向前 PRIOR 向后 FIRST:结果集第一行记录 LAST:结果集最后一行记录(不能动态读取更新的数据)
–动态游标:NEXT 向前 PRIOR 向后 FIRST:结果集第一行记录 LAST:结果集最后一行记录(可以动态读取数据)
–滚动游标:NEXT PRIOR FIRST LAST

DECLARE @productName VARCHAR(50),@price MONEY
--DECLARE cursor_product CURSOR SCROLL
--FOR SELECT ProductName,Price FROM Product

--OPEN cursor_product --打开游标:已打开,再次重新打开需要先关闭释放掉

PRINT '产品名称'+'  价格'

--RELATIVE N:相对于当前游标位置(N为正:则向前移动N行,N为负的话:则向后移动N行)

FETCH RELATIVE 3 FROM cursor_product INTO @productName,@price  
PRINT @productName+'  '+CAST(@price AS VARCHAR)

--ABSOLUTE N:以结果集为参照(N为正:将游标移动到距离第一行的N,N为负的话:将游标移动到距离最后一行的前N)

FETCH ABSOLUTE 2 FROM cursor_product INTO @productName,@price  
PRINT @productName+'  '+CAST(@price AS VARCHAR)

FETCH NEXT FROM cursor_product INTO @productName,@price  --将游标向前移动(移动指向下一条行记录)

PRINT @productName+'  '+CAST(@price AS VARCHAR)

FETCH PRIOR FROM cursor_product INTO @productName,@price --将游标向后移动(移动指向上一条行记录)
PRINT @productName+'  '+CAST(@price AS VARCHAR)

FETCH FIRST FROM cursor_product INTO @productName,@price  --将游标向指向返回的结果集中的第一条记录
PRINT @productName+'  '+CAST(@price AS VARCHAR)

FETCH LAST FROM cursor_product INTO @productName,@price   --将游标向指向返回的结果集中的最后一条记录
PRINT @productName+'  '+CAST(@price AS VARCHAR)

CLOSE cursor_product --关闭游标
DEALLOCATE cursor_product --释放游标

在存储过程中使用游标:

CREATE PROC Query_Products(  --定义存储过程
 @ProductNo INT  --定义输入参数
)
AS
BEGIN

DECLARE @productName VARCHAR(30),@typeName VARCHAR(20) --定义接收参数
BEGIN TRY  --异常捕获
BEGIN TRAN --开启事务

DECLARE cursor_queryProducts CURSOR --声明游标
FOR
 SELECT ProductName,PT.TypeName FROM Product P
 INNER JOIN ProductType PT
 ON(P.TypeId=PT.TypeId)
 WHERE ProductNo>@ProductNo

OPEN cursor_queryProducts --打开游标
PRINT '产品名称'+'   产品类型'
--移动游标,读取游标中数据,且将读取到的数据赋值给参数
FETCH NEXT FROM cursor_queryProducts INTO @productName,@typeName 

WHILE @@FETCH_STATUS=0  --循环读取游标数据
BEGIN 
PRINT @productName+'  '+@typeName
FETCH NEXT FROM cursor_queryProducts INTO @productName,@typeName
END

CLOSE cursor_queryProducts  --关闭游标
DEALLOCATE cursor_queryProducts  --释放游标

COMMIT TRAN --提交事务
END TRY
BEGIN CATCH --catch语句块
ROLLBACK  --回滚事务
END CATCH
END

调用带输入参数存储过程:

EXEC  Query_Products 1016

游标:主要用于存储过程、触发器和T-SQL脚本中,

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐