一、游标的定义

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. Golang的运算符-位运算符

    Golang的运算符-位运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算符概述 常见的位逻辑运算符: &: 位与运算符,表示AND(表示所有条件都得匹配), ...

  2. Asp.net mvc项目分页功能

    1.定义一个分页用的Page<T>类 /* 使用示例: var pager = new Pager<Article>( this.ControllerContext, //上下 ...

  3. 会话控制——Cookie和Session

    Cookie简介 l  HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条 ...

  4. Centos 时间与主机时间不匹配问题解决

    有时候新安装的虚拟机的系统时间会和主机的时间差8个小时,这是因为虚拟机和主机所在的时区不同. 这会导致当你往mysql数据库插入数据时如果设置时间为current_time结果会和虚拟机保持一致. 1 ...

  5. 078-PHP数组排序,两次循环法

    <?php $arr=array(35,43,56,2,76,23,47,55,71); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr ...

  6. React 学习笔记(1) 基础语法和生命周期

    参看:视频地址 简单搭建一个react-cli: 2. React.createElement() 将object转化为 React语法 import React from 'react' impor ...

  7. MESI缓存一致性协议

    整理一下一些计算机的基础概念. 概念 MESI(Modified, Exclusive, Shared, Invalid) 也称 Illinois 协议, 由美帝UIUC(University of ...

  8. Docker 容器shell

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  9. HDU 5455:Fang Fang 查cff个数

    Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  10. 【shell】常用shell脚本

    1.检查主机存活状态 #!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2" for IP in $IP_LIST; ...