T_SQL编程中使用游标循环结果循环多次的问题 在做一个数据库实训题目的时候碰到了这个问题,首先来看一下题目 依次读出 student 表中的数据,判断是否为男生,如果是,就在 sc 表中将其 所有的选课成绩上浮 10%
题目 这是Student表
Student表 这是SC表
SC表 首先这个用简单的sql语句很好作答
直接嵌套就ok了,看SC表成功修改
但是有点不符合题意,题目说是依次读出 student 表中的数据,判断是否为男生,这里没有实现依次和判断,老师目的是让我们做Tsql编程来做,所以换了一种思路,使用游标来做 先把SC表还原
看一下游标的用法
这个网上的示例是游标指向sk_tabl_name表里的djno, 打开游标,循环查询,查询道德djno存入@djno变量, 然后更新 tab_yb表的netsum+1然后指向表的下一行的djno OK,仿写一下
看着没有任何问题,根据题目要求多加了一个判读,当@sex是男的时候,才执行Grade=Grade*1.1 ok执行一下 看下结果
????? 怎么是122 122/92=1.326……… 怎么会是这样呢,怎么不是1.1倍?? 中间想了半天,找了半天的资料,什么sql的小数运算问题什么的,都不对 好了,直接看问题的原因吧 看一下执行的信息
这是信息,注意看这里的Affected rows这里显示了三次,一次改了三行 ?我们来计算一下92*1.1*1.1*1.1=122.452,正好是122,好吧,为什么会乘了三次呢 看下代码
主要的逻辑在这里 直接说错误的原因吧 这里的UPDATE语句下面的where直接匹配到所有的Sno,这里就会执行三次update执行一次就会显示Affected rows 3,影响了三行,而且外面套了while,while中的if也执行三次就会出现三次Affected rows 3,所以男生的成绩上浮了3次110% 问题找到了,怎么修改呢,有人说用‘IN‘换成‘=’不就好了吗,显然是不行的,因为子查询有多个结果,不能用‘=’, 现在的目的就是让Where的地方一次取一个性别,而且下一次不要取已经取过的一行,要指向下一行,ok,说到指向,只能用游标了,再加一个游标? 试一下
试着用两个游标来做 分别在Student中找到Sno,Ssex给变量@sex,@sno Where条件写sno=@sno 修改之后,指向下一行的sex,sno 执行一下
While里的IF执行了三次,因为是三个男生 但是只有第一次执行了修改 因为只有第一个男生的学号在sc表里面有 后面两个男生,在sc里面不存在,不执行修改 结果就是我们想要的
OK,答案正确,结束
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/61582.html