来源:网易云课堂《精通MySQL存储过程、函数和触发器》课程
讲师:huangxifeng607(黄锡峰)
笔记
(1)存储过程需求分析
生产场景描述:
1.在游戏中,每个账号(accountid)可以最多5个角色(characterid)。角色表:t_game_character
2.5个角色放到一定的槽位(slot)中,槽位值必须是0-4,不能有相同的槽位,否则在游戏中就无法正常看到所有角色。
3.两个游戏分区合服,合服之后每个账号按规则删除只剩下5个角色,但槽位值可能有重复的。
实现需求:同一个账号有多个角色有重复槽位值,需要重置槽位值,使其值在0-4且不重复。
实现难点:有多个账号accountid,多个账号下又有多个角色。
多个账号使用一个循环,每个账号下多个角色又使用循环,即使用嵌套循环。
多个账号使用游标来实现,每个账号下多个角色又使用嵌套游标来实现。
create procedure procharslot()
begin
declare AID int;
declare stopflag int default 0;
declare curacc cursor for select accountid from reset_slot_accountid;
declare continue handler for not found set stopflag=1;
open curacc;
repeat
fetch curacc into aid;
begin
declare Cid int;
declare CSlot int;
declare done int default 0;
declare CurChar cursor from select characterid from t_game_character where accountid=AID;
declare continue handler for not found set done=1;
set CSlot=0;
open CurChar;
fetch CurChar into Cid;
while(done=0) do
begin
update t_game_character set CharSlot=CSlot where characterid=Cid;
set CSlot=CSlot+1;
fetch CurChar into Cid;
end;
end while;
close CurChar;
end;
until stopflag=1 end repeat;
close curacc;
end;