代码段 sql存储过程遍历缺失,插入数据修复数据

代码段 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;
发布了70 篇原创文章 · 获赞 14 · 访问量 2622

猜你喜欢

转载自blog.csdn.net/Captain_DUDU/article/details/103510256