MySQL存储过程:表名为变量

如果一个存储过程的变化的部分只有表名的部分,我们可以给存储过程传入这个表名。这就需要我们承接一下传入的参数,然后使用PREPARE了,关于PREPARE,需要参考官方文档来解释一下,这里先贴上解决问题的代码:

DELIMITER $$

USE `reptail`$$

DROP PROCEDURE IF EXISTS `updateTest`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateTest`(IN table_name VARCHAR(50))
BEGIN
    SET @tbl_name=CONCAT("",table_name);
    SET @statement = CONCAT("UPDATE ",@tbl_name," AS c,`x1` AS b SET c.`hello` = b.`world` WHERE c.`id` = b.`uuid`; ");
    PREPARE stmt FROM @statement;
    EXECUTE stmt;
    SET @statement = CONCAT("UPDATE ",@tbl_name," AS c,`x2` AS b SET c.`hello` = b.`world` WHERE c.`id` = b.`uuid`; ");
    PREPARE stmt FROM @statement;
    EXECUTE stmt;
    SET @statement = CONCAT("UPDATE ",@tbl_name," AS c,`x3` AS b SET c.`hello` = b.`world` WHERE c.`id` = b.`uuid`; ");
    PREPARE stmt FROM @statement;
    EXECUTE stmt;
    SET @statement = CONCAT("UPDATE ",@tbl_name," AS c,`x4` AS b SET c.`hello` = b.`world` WHERE c.`id` = b.`uuid`; ");
    PREPARE stmt FROM @statement;
    EXECUTE stmt;
    SET @statement = CONCAT("UPDATE ",@tbl_name," AS c,`x5` AS b SET c.`hello` = b.`world` WHERE c.`id` = b.`uuid`; ");
    END$$

DELIMITER ;

问题解决了,那么,何为PREPARE呢?时至2017年8月24日20:11:48,官方的手册的解释是:

The PREPARE statement prepares a SQL statement and assigns it a name, stmt_name, by which to refer to the statement later. The prepared statement is executed withEXECUTE and released with DEALLOCATE PREPARE.

翻译为中文的大概意思就是:

PREPARE语句准备一个SQL的statement,并且,它会给这个statement一个名字以便我们之后引用。我们可以使用EXECUTE语句执行这个准备好的statement,也可以使用DEALLOCATE PREPARE来释放掉它。

转载于:https://my.oschina.net/hengbao666/blog/1574659

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值