• SQL游标的介绍与使用举例


    一、游标的定义

    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学习笔记9——SQL中检索数据之分页查询
    SQL学习笔记8——SQL中检索数据之子查询
    SQL学习笔记7——SQL中检索数据之连接查询
    Two Pointer
    LeetCode 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
    leetcode 30 days challenge Check If a String Is a Valid Sequence from Root to Leaves Path in a Binary Tree
    LeetCode First Unique Number
    letcode1143 Longest Common Subsequence
    Leetcode 560 Subarry Sum Equals K
    leetcode Leftmost Column with at Least a One
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/9916564.html
Copyright © 2020-2023  润新知