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

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值