MySQL的存储过程在5.0后的版本中支持了动态sql语句。也就是说我们可以通过传的参数不同拼接查询不同的表或执行不同的语句。
1. 动态语句没有返回值
如:需要根据不同的游戏ID去增加 TGameData_ID
表中玩家对应的金币数。
CREATE DEFINER = `test`@`%` PROCEDURE `AddGold`(IN `GameId` INT,IN `UserId` INT,IN `addvalue` INT)
BEGIN
-- 用CONCAT拼接查询sql语句
SET @sqlStr= CONCAT('UPDATE TGameData_',Gameid,' SET Gold = Gold +',addvalue,', WHERE CUserID = ',UserId,';');
PREPARE stmt FROM @sqlStr; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
END;
2. 动态语句有返回值
如:需要根据不同的游戏ID去 TGameData_ID
表中查询玩家对应的金币数,数量足够减去,数量不够不减。
CREATE DEFINER = `test`@`%` PROCEDURE `DelGold`(IN `GameId` INT,IN `UserId` INT,IN `delvalue` INT, OUT `result` INT)
BEGIN
-- 用CONCAT拼接查询sql语句
SET @sqlStr= CONCAT('SELECT Gold INTO @gold FROM TGameData_',GameId,' WHERE `CUserID` = ',UserId,' LIMIT 1;');
PREPARE stmt FROM @sqlStr; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
IF @gold >= delvalue THEN
SET @sqlStr= CONCAT('UPDATE TGameData_',Gameid,' SET Gold = Gold -',delvalue,', WHERE CUserID = ',UserId,';');
PREPARE stmt FROM @sqlStr; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
set result = 1; -- 设置结果
ELSE
set result = 0; -- 设置结果
END IF;
END;