Data Base学习记录:SQL_游标


游标:就是像高级语言一样,是存放数据集,并逐条访问的一种机制。游标使用的五步:

声明游标

两种形式:
*

DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
DECLARE cursor_name CURSOR[LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
DECLARE cursor_name [INSENSITIVE] [SCROLL]
CURSOR FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
INSENSITIVE关键字指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。如果在后来游标处理的过程中,原表中数据发生了改变,对于该游标而言是不可见的。这种游标不允许数据更改。
SCROLL指明游标可以在任意方向上滚动。所有的fetch选项
(firstlastnext、relative、absolute)都可以使用。缺省则游标只能向前滚动(next)。
Select_statement指明SQL语句建立的结果集。不允许使用COMPUTECOMPUTE BYFOR BROWSEINTOREAD ONLY指明不允许数据修改。UPDATE则可以修改。OF column_list指明结果集中可以进行修改的列。使用
UPDATE关键字则所有的列都可进行修改。	
DECLARE cursor_name CURSOR[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC] [READ_ONLY | SCROLL_LOCKS |
OPTIMISTIC] FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}] LOCAL指明游标是局部的,只能在它所声明的过程中使用。GLOBAL游标对连接全局可见。当连接结束时游标才不可用。FORWARD_ONLY指明游标只能向前滚动。
STATIC与INSENSITIVE作用相同。KEYSET创建键集驱动游标。DYNAMIC指明游标将反映所有对结果集的修改。缺省为DYNAMIC。
SCROLL_LOCK表明,为了保证游标操作的成功,而对修改或删除行进行加锁。OPTIMISTIC则不加锁。

打开游标

OPEN{{[GLOBAL]cursor_name}|cursor_variable_name}
Cursor_variable_name是所引用游标的变量名。
在游标被打开后,系统变量@@cursor_rows可以用来检测结果 集的行数。@@cursor_rows为负数时,表示游标正在被异步迁 移,其绝对值为当前结果集的行数。

从游标中取值

FETCH[NEXT|PRIOR|FIRST|LAST|ABSOLUTE {n|@nvar}|
RELATIVE {n|@nvar}] FROM[GLOBAL]{cursor_name
|cursor_variable_name}
[INTO @variable_name ][,……n]]
ABSOLUTE n:取结果集中的第n行,n为0不能得到任何行。RELATIVE n:取出当前行的前n行或后n行。值为正则取出的
行在当前行前n行的位置上,如果该值为负数,则返回当
前行的后n行。
FETCH执行状态存储在系统变量@@fetch_status中。如果FETCH成功,则@@fetch_status0

关闭游标

CLOSE [GLOBAL]cursor_name|cursor_variable_name
游标关闭之后,不能再执行FETCH操作。如果还需要使用
FETCH语句,则要重新打开游标。

释放游标

DEALLOCATE
[GLOBAL]cursor_name|cursor_variable_name

举例

  • 对于表
BorrowRecord(BorrowRecord, StudentID, StudentFeeID, BorrowDate, ReturnDate, Fee) *学生借书记录表(流水号, 学号, 费用结算号(外键), 借出时间, 归还时间, 借书费用)
StudentFee(StudentFeeID, StudentID, BorrowBookAllFee) *学生费用结算表(费用结算号(主键), 学号, 所有借书总费用)
  • 两者关系为多对一的关系,关联字段为StudentFeeID。
  • 由于某种原因StudentFee表的数据遭到了破坏,想将“所有借书总费用”重算。
*声明一个游标
DECLARE curStudentFee CURSOR FOR
SELECT StudentFeeID FROM StudentFee
*声明两个费用变量
DECLARE @mAllFee Money	*总费用DECLARE @iFeeID	Int	*借书结算号
*初始化
SET @mAllFee=0 SET @iFeeID=0
*打开游标
OPEN curStudentFee
*循环并提取记录
FETCH FIRST FROM curStudentFee INTO @iFeeID WHILE ( @@Fetch_Status=0 )
BEGIN
*从借书记录中计算某一学生的借书总记录的总费用SELECT @mAllFee=Sum(Fee)
FROM BorrowRecord
WHERE StudentFeeID=@iFeeID
*更新到汇总表。
UPDATE StudentFee SET BorrowBookAllFee=@mAllFee WHERE StudentFeeID=@iFeeID
FETCH NEXT FROM curStudentFee INTO @ iFeeID END
*关闭游标
CLOSE curStudentFee
*释放游标
DEALLOCATE curStudentFee
游标的使用包括声明、打开、关闭、释放。
@@Fetch_Status 游标提取状态标志,0表示正确。
【例】假设有学生成绩表和各系英语成绩汇总表,可用游标将学生英语成绩逐个汇总到各系英语成绩汇总表。
* 游标占用内存,并且会锁定表,效率不高。执行一次Fetch相当于执行一次SELECT
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Lucia1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值