您的位置:首页 > 数据库 > MySQL

MySQL存储过程实战:给指定的玩家发放Avatar Item

2011-07-13 11:10 573 查看
之前的博客文章

MySQL上存储过程和触发器的一个实例 -- 为注册新玩家赠送avatar item

里写过对于所有的注册玩家都发放avatar Item的例子。但是免费的午餐不会一直都有,注册就免费送的活动结束以后,还是要手式挑选出符合条件的玩家,进行avatar item的发放工作。这里接着

MySQL上存储过程和触发器的一个实例 -- 为注册新玩家赠送avatar item

的思路,做了一个针对指定玩家(按用户名)发放avatar Item的存储过程:相关的数据表结构请参阅

MySQL上存储过程和触发器的一个实例 -- 为注册新玩家赠送avatar item

首先来看主的给avatar item的存储过程:

DROP PROCEDURE IF EXISTS IssueAvatarItems;
CREATE PROCEDURE IssueAvatarItems (IN PlayerName VARCHAR(20), OUT ResultString VARCHAR(100))
BEGIN
DECLARE Gender int;
DECLARE AID int;
DECLARE RCount int;

SELECT 'Start processing player info...' into ResultString;

SELECT Account.AccountID into AID from Account where UserName = PlayerName;
/*Get the accountID from the player's username*/
SELECT FOUND_ROWS() into RCount;
IF (RCount=0) THEN # if there is no such player with the username
SELECT CONCAT('The player \'',PlayerName,'\' is not found in GameDB!') INTO ResultString;
ELSE
SELECT DISTINCT CharacterAttr.Gender INTO Gender FROM CharacterAttr, GameCharacter
WHERE CharacterAttr.CharacterID = GameCharacter.CharacterID
AND GameCharacter.AccountID= AID;
IF (Gender =0) THEN # it is a Male
CALL IssueMaleAvatarItem(AID);
ELSEIF (Gender =1) THEN # if it is a Female
CALL IssueFemaleAvatarItem(AID);
END IF;

SELECT ItemID from PlayerItem WHERE AccountID= AID;/*Checking inserting results*/
SELECT FOUND_ROWS() into RCount;
IF (RCount>5) THEN
SELECT CONCAT('Player: \'',PlayerName, '\' has been successfully given ',RCount,' Avatar Items!') INTO ResultString;
ELSE
SELECT CONCAT('Player: \'',PlayerName, '\' has errors in issuing avatar items!') INTO ResultString;
END IF;
SELECT ResultString;
END IF;

END;


这里的思路是:输入为@PlayerName,也就是UserName; 输出是@ResultString,来记录最终执行的结果的字符串;定义了三个变量,都是int型的: Gender用来存放查询到的玩家的性别; AID用来存放AccountID; RCount用来存放FOUND_ROWS()的值。

首先是通过玩家的UserName来查询他/她的AccountID; 如果没有符合条件的玩家,就在@ResultString中记录相应的错误信息; 如果有查到对应的玩家的AccountID,就根据AccountID来取得其性别,存放在@Gender中;有了性别的信息,就可以根据男女,分别调用IssueMaleAvatarItem和IssueFemaleAvatarItem的存储过程来发放对应的Avatar Item。调用子SP完成以后,查询PlayerItem表来确认对应的玩家已经得到了Avatar Item。如果结果的记录数大于5,就是发放成功了,否则则是出了问题。对@ResultString变量会做相应的更新。

对应的两个子存储过程的定义如下:

DROP PROCEDURE IF EXISTS IssueMaleAvatarItem;
CREATE PROCEDURE IssueMaleAvatarItem (in AID int)
/*INSERT into the playeritem table the full set of
available avatar items for male player*/
BEGIN
DECLARE ItemCount int;

/*Check if the player already has some avatar items in the PlayerItem table*/
SELECT count(0) into ItemCount from PlayerItem
WHERE AccountID = AID;

IF (ItemCount < 1) THEN
/*Insert male avatar items if there are no items stored for this player in PlayerItem table */
# INSERT the full set of avatar item for this player:
INSERT INTO PlayerItem (AccountID,ItemID,Quantity,Status,ExpirationTime,InUse)
VALUES(AID, '0','1','1','2022-12-31 12:12:12','1'), #default face
(AID, '15','1','1','2022-12-31 12:12:12','1'), #hair set
(AID, '17','1','1','2022-12-31 12:12:12','0'),
(AID, '19','1','1','2022-12-31 12:12:12','0'),
(AID, '69','1','1','2022-12-31 12:12:12','0'),
(AID, '71','1','1','2022-12-31 12:12:12','0'),
(AID, '73','1','1','2022-12-31 12:12:12','0'),
(AID, '75','1','1','2022-12-31 12:12:12','0'),
(AID, '77','1','1','2022-12-31 12:12:12','0'),
(AID, '79','1','1','2022-12-31 12:12:12','0'),
(AID, '81','1','1','2022-12-31 12:12:12','0'),

(AID, '31','1','1','2022-12-31 12:12:12','1'), #clothes set
(AID, '28','1','1','2022-12-31 12:12:12','0'),
(AID, '29','1','1','2022-12-31 12:12:12','0'),
(AID, '30','1','1','2022-12-31 12:12:12','0'),

(AID, '53','1','1','2022-12-31 12:12:12','0'), #hat set
(AID, '54','1','1','2022-12-31 12:12:12','0'),
(AID, '55','1','1','2022-12-31 12:12:12','0'),
(AID, '89','1','1','2022-12-31 12:12:12','0'),
(AID, '90','1','1','2022-12-31 12:12:12','0'),
(AID, '91','1','1','2022-12-31 12:12:12','0'),
(AID, '92','1','1','2022-12-31 12:12:12','0'),
(AID, '93','1','1','2022-12-31 12:12:12','0'),
(AID, '94','1','1','2022-12-31 12:12:12','0'),
(AID, '95','1','1','2022-12-31 12:12:12','0'),

(AID, '46','1','1','2022-12-31 12:12:12','0'), #glass set
(AID, '47','1','1','2022-12-31 12:12:12','0'),
(AID, '48','1','1','2022-12-31 12:12:12','0');

End IF;
END;




DROP PROCEDURE IF EXISTS IssueFemaleAvatarItem;
CREATE PROCEDURE IssueFemaleAvatarItem (in AID int)
/*INSERT into the playeritem table the full set of
available avatar items for female player*/
BEGIN
DECLARE ItemCount int;

/*Check if the player already has some avatar items in the PlayerItem table*/
SELECT count(0) into ItemCount from PlayerItem
WHERE AccountID = AID;

IF (ItemCount < 1) THEN
/*Insert female avatar items if there are no items stored for this player in PlayerItem table */
# INSERT the full set of avatar item for this player:
INSERT INTO PlayerItem (AccountID,ItemID,Quantity,Status,ExpirationTime,InUse)
VALUES(AID, '3','1','1','2022-12-31 12:12:12','1'), #default face
(AID, '7','1','1','2022-12-31 12:12:12','1'), #hair set
(AID, '9','1','1','2022-12-31 12:12:12','0'),
(AID, '11','1','1','2022-12-31 12:12:12','0'),
(AID, '13','1','1','2022-12-31 12:12:12','0'),
(AID, '56','1','1','2022-12-31 12:12:12','0'),
(AID, '58','1','1','2022-12-31 12:12:12','0'),
(AID, '61','1','1','2022-12-31 12:12:12','0'),
(AID, '63','1','1','2022-12-31 12:12:12','0'),
(AID, '65','1','1','2022-12-31 12:12:12','0'),
(AID, '67','1','1','2022-12-31 12:12:12','0'),

(AID, '21','1','1','2022-12-31 12:12:12','1'), #clothes set
(AID, '22','1','1','2022-12-31 12:12:12','0'),
(AID, '23','1','1','2022-12-31 12:12:12','0'),
(AID, '24','1','1','2022-12-31 12:12:12','0'),

(AID, '49','1','1','2022-12-31 12:12:12','0'), #hat set
(AID, '50','1','1','2022-12-31 12:12:12','0'),
(AID, '51','1','1','2022-12-31 12:12:12','0'),
(AID, '52','1','1','2022-12-31 12:12:12','0'),
(AID, '83','1','1','2022-12-31 12:12:12','0'),
(AID, '84','1','1','2022-12-31 12:12:12','0'),
(AID, '85','1','1','2022-12-31 12:12:12','0'),
(AID, '86','1','1','2022-12-31 12:12:12','0'),
(AID, '87','1','1','2022-12-31 12:12:12','0'),
(AID, '88','1','1','2022-12-31 12:12:12','0'),

(AID, '42','1','1','2022-12-31 12:12:12','0'), #glass set
(AID, '43','1','1','2022-12-31 12:12:12','0'),
(AID, '44','1','1','2022-12-31 12:12:12','0'),
(AID, '45','1','1','2022-12-31 12:12:12','0');

End IF;
END;


剩下的就是准备相应的调用脚本了,可以有Excel里用CONCATENATE函数来做:在一张新datasheet中第一列放所有的玩家的UserName;第二列的公式用:=CONCATENATE("call guocui3.IssueAvatarItems('", $A1, "'@ResultString);") . 最后生成的脚本应该是这样的:

call guocui3.IssueAvatarItems('mnbvcxz123', @ResultString);
call guocui3.IssueAvatarItems('qinqin168', @ResultString);
call guocui3.IssueAvatarItems('Torowang365', @ResultString);
call guocui3.IssueAvatarItems('ldj123', @ResultString);
call guocui3.IssueAvatarItems('dubtttt', @ResultString);
call guocui3.IssueAvatarItems('yangxin123', @ResultString);
call guocui3.IssueAvatarItems('yr0219', @ResultString);
call guocui3.IssueAvatarItems('fxy9988', @ResultString);
call guocui3.IssueAvatarItems('cuixu008', @ResultString);
call guocui3.IssueAvatarItems('q1425651039', @ResultString);
call guocui3.IssueAvatarItems('pengpeng', @ResultString);
call guocui3.IssueAvatarItems('majiangzhi', @ResultString);
call guocui3.IssueAvatarItems('woyaosha', @ResultString);
call guocui3.IssueAvatarItems('leon3327', @ResultString);
call guocui3.IssueAvatarItems('hongren', @ResultString);
call guocui3.IssueAvatarItems('tinashi', @ResultString);


连接到相应的数据库,执行上面的SQL脚本就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: