当前位置:   article > 正文

mysql存储过程prepare_MySQL存储过程中使用动态sql语句

mysql 存储过程 调用deallocate prepare

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;

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号