一、游标的定义

declare (游标名) [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR{READ ONLY|UPDATE[OF column_name[,...n] ] } ];

二、游标的介绍

  (1)当指定INSENSITIVE时,系统将创建游标指向的表的临时副本,后续游标的所有操作将针对该副本(tempdb)进行,也就是说,不会对基表进行修改(事实上使用INSENSITIVE游标时不允许进行修改操作),而其他用户对基表的操作也就不会显示在之后的提取中。其实从字面上就很好理解啦,INSENSITIVE就是不敏感,所以其他用户的操作不会影响它,若不加INSENSITIVE字段,则默认所有用户对基表提交的删除和更新都将反映在后面的提取中。

  (2)当指定SCROLL时,会指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用,若未指定SCROLL,则NEXT是唯一支持的提取选项,如果指定SCROLL,则不能也指定FAST_FORWARD。

  (3)select_statement语句用来定义游标结果集,UPDATE定义游标中可更新的列(若未声明,则默认所有列都可更新),如果声明为READ ONLY则此游标为只读游标,不能对任何列进行更新。

三、游标的使用举例

1.判断成绩是否及格

---判断成绩是否及格
declare @xuehao char(10),@kechenghao char(10)
declare @chenji int
declare cc1 cursor for select sno,cno,grade from sc --定义游标cc1
open cc1 --打开游标;执行与游标相关联的查询语
fetch next from cc1 into @xuehao,@kechenghao,@chenji
--从游标中取得第一记录内容存入变量
while @@fetch_status=0 --判断获取是否成功,即记录是否取得完成 全局变量用两个@@
begin
  if @chenji<60
print @xuehao+@kechenghao+'不及格'
  else
print @xuehao+@kechenghao+'及格'
fetch next from cc1 into @xuehao,@kechenghao,@chenji
end
close cc1
deallocate cc1

 提前声明好变量以便使用游标,当需要使用游标时先打开游标,然后用FETCH语句为变量赋初值,可以使用系统自带全局变量FETCH_STATUS来判断最近一次FETCH语句游标提取的情况,当FETCH_STATUS = 0时,说明提取成功且返回结果不为空,当FETCH_STATUS < 0时说明提取失败, 当FETCH_STATUS > 0时说明提取成功但无返回结果。

  FETCH_STATUS常常用来做游标遍历表格的结束条件。记得在循环中再次使用FETCH语句让游标移动并更新变量的值(SQL语言不同于C等语言,不能在WHILE条件中兼顾游标下移判断FETCH_STATUS),当循环结束,游标使用完毕后使用CLOSE语句关闭游标,当不再使用此游标时,使用DEALLOCATE语句释放游标。

2.为不同分数段学生加分:)

declare @xuehao char(10), @kechenghao char(10);
declare @chengji int;
declare cc2 cursor for select sno, cno, degree from score;
open cc2;
fetch next from cc2 into @xuehao, @kechenghao, @chengji;
while @@FETCH_STATUS = 0
begin
if @chengji > 80
begin
update score set degree = degree + 10;
print @xuehao +@kechenghao + '成绩大于80,再加10分!';
end
else if @chengji > 70
begin
update score set degree = degree + 20;
print @xuehao +@kechenghao + '成绩大于70,再加20分!';
end
else if @chengji > 60
begin
update score set degree = degree + 30;
print @xuehao +@kechenghao + '成绩大于60,再加30分!';
end
else
begin
update score set degree = degree + 40;
print @xuehao +@kechenghao + '不及格,再加40分!';
end
fetch next from cc2 into @xuehao, @kechenghao, @chengji;
end
close cc2;
deallocate cc2;

  题目其实和上一个差不多,只不过增加了IF-ELSE语句的配合使用,另外一点收获是在PRINT语句中不能直接输出INT型变量,只能输出CHAR型,若想输出INT型,可以使用STR()函数转化为CHAR型输出,例如 PRINT sno+sname+cno+STR(score);

SQL游标的介绍与使用举例的更多相关文章

  1. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  2. Library Cache优化与SQL游标

    Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1 SQL语句与父游标及子游标 在PL/SQL ...

  3. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  4. sql 游标例子 根据一表的数据去筛选另一表的数据

    sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...

  5. sql 游标循环当中重新赋值

    sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值

  6. SQL 游标的应用

    ----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #te ...

  7. PL/SQL 游标 (实验七)

    PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...

  8. PL/SQL游标详解

    刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行. 只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of seque ...

  9. Oracle PL/SQL游标

    游标的提出: SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录.所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求. ...

随机推荐

  1. HIVE ROW_NUMBER()函数去重

    SELECT * FROM( SELECT *,ROW_NUMBER() OVER(PARTITION BY a.claimno ORDER BY b.financiancedate DESC)  n ...

  2. 7 —— node —— 响应图片

      const http = require('http'); const fs = require('fs'); const server = http.createServer(); server ...

  3. 概率图模型之EM算法

    一.EM算法概述 EM算法(Expectation Maximization Algorithm,期望极大算法)是一种迭代算法,用于求解含有隐变量的概率模型参数的极大似然估计(MLE)或极大后验概率估 ...

  4. Spring 实战4学习笔记(转)

    http://blog.csdn.net/21aspnet/article/details/51386557 1.IOC装配Bean 参考[spring实战4 2.2],作者提倡无XML配置化. 1. ...

  5. v2??? 替换协议

    输入 v2??? 命令,选择修改 v2??? 配置, 然后选择修改传输协议, 可以选择 mKcp_wechat-video .然后重新生成 vmess,放入客户端使用.

  6. Python MySQL 创建数据库

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  7. Node.js NPM 管理包

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 根据安 ...

  8. javaBean命名属性时的小注意点

    javabean属性命名的时,第一个和第二个字母最好不要是大写字母,不然使用eclipse自动生成getter和setter方法时,会出现奇怪的问题,导致struts2封装属性的封装不上. priva ...

  9. 在登陆退出时候使用Vuex

    1.登陆的时候,在登陆模块请求接口,然后获取一个access_token,获取用户权限.保存到缓存里面. 2.退出的时候,请求退出接口,把缓存里面的access_token清除. 一旦要在登陆里面做一 ...

  10. 使用SSH工具连接WSL

    简单记录下操作过程 我在微软应用商店下载了Ubuntu 18.04 LTS.但是Windows的命令行太丑,我打算使用SSH工具连接WSL,输入密码一直拒绝连接... 查找资料之后解决了这个问题 双击 ...