代码段 sql存储过程遍历缺失,插入数据修复数据
根据平均数修复数据的代码段
方法1
亮点:利用 limit 1 去限制每次select 一条数据 ,每次修复第一条
DROP PROCEDURE if EXISTS 查询2;
create PROCEDURE 查询2 (in _sid int )
BEGIN
DECLARE lack_cid int;
DECLARE avgNum FLOAT;
DECLARE dotimes int DEFAULT 0;
DECLARE local_time int DEFAULT 1;
SELECT COUNT(cid) into dotimes FROM course WHERE Cid not in
(SELECT cid FROM sc WHERE sid=_sid );
WHILE local_time <= dotimes DO
SELECT avg(score),cid into avgNum,lack_cid FROM sc WHERE cid=
(SELECT cid FROM course WHERE Cid not in
(SELECT cid FROM sc WHERE sid=_sid ) LIMIT 1); #_sid
if avgNum >0.6 THEN
INSERT sc VALUES(_sid,lack_cid,avgNum);
ELSEif avgNum >0.8 THEN
INSERT sc VALUES(_sid,lack_cid,avgNum+10);
ELSE
INSERT sc VALUES(_sid,lack_cid,avgNum*0.9);
end if;
SELECT local_time+1 INTO local_time;
END WHILE;
END
CALL 查询2(2);
SELECT * FROM sc WHERE sid=2
方法2
定义游标
Declare 游标名 cursor for select语句;
定义游标结束语句
Declare continue handler for not found set 变量名=值;
打开游标
Open 游标名 ;
推进游标指针
Fetch 游标名 into 变量名(此变量存储是当前记录的值)
关闭游标
Close 游标名;
利用游标,去遍历select出来的 一列数据,一次一个,自动遍历,不需要再每次使用limit去限制只读一条数据
CREATE PROCEDURE 查询3 (in _sid int)
BEGIN
DECLARE isend int DEFAULT 0;
declare lack_cid int;
DECLARE avg_score int;
DECLARE seek CURSOR for SELECT cid FROM course WHERE cid not in(SELECT cid FROM sc WHERE sid=_sid ) ;
declare continue handler for not found set isend=1;
open seek ;
fetch seek into lack_cid;
WHILE isend=0 DO
SELECT AVG(score) INTO avg_score FROM sc WHERE cid=lack_cid ;
INSERT sc VALUES (_sid,lack_cid,avg_score);
FETCH seek INTO lack_cid;
end WHILE ;
CLOSE seek;
end
CALL 查询3 (10);
SELECT * FROM sc GROUP BY sid,cid;
用游标解释 max 的冒泡过程;
CREATE PROCEDURE 查询4(in _cid int,OUT max_sid_new int,out maxscore_new int )
BEGIN
DECLARE max_score_sid int ;
DECLARE max_score int ;
DECLARE isend INT DEFAULT 0;
DECLARE seek cursor for SELECT sid,score FROM sc WHERE cid=_cid;
DECLARE continue handler for not found set isend=1;
open seek;
FETCH seek into max_score_sid,max_score;
set maxscore_new=0;
set max_sid_new=-1;
WHILE isend=0 DO
if maxscore_new<max_score then
set maxscore_new=max_score;
set max_sid_new=max_score_sid;
end IF;
fetch seek into max_score_sid,max_score;
END WHILE;
CLOSE seek;
END
set @ss=0;
set @s2=0;
call 查询4(2,@ss,@s2);
SELECT @ss, @s2;