mysql的动态sql实现变量表名及占位符的使用

MySQL 在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况,如数据量很大的时候就会用到分表。通过在网上查了mysql 5.1以上的版本提供了prepare语句用于支持这种操作。
参考http://blog.csdn.net/shark1682003/article/details/17785095博客的内容,完成了动态表名的查询

具体实现是通过存储过程了来完成的:

drop PROCEDURE if EXISTS test;
-- 用drop 来删除存储过程或者表
create PROCEDURE test(tableName varchar(20))
-- 创建存储过程 命名为test
BEGIN
  set @tableNames = CONCAT(tableName);
  -- @先在用户变量中保存值然后在以后引用它
  set @sqlStr = CONCAT('select * from ? ');
   -- 拼接查询总记录的SQL语句 
  prepare stmt from @sqlStr;
  -- 预定义一个语句,并将它赋给 stmt
  execute stmt using @tableNames;
  -- 执行语句
  deallocate prepare stmt;
  -- 要释放一个预定义语句的资源
END;

字符串需要拼接不然就报这个错误

 -- [SQL] call test11('background'); 
 -- [Err] 1064 - You have an error in your SQL syntax;  
 check the manual that corresponds to your MySQL server  version for the right syntax to use near '?' at line 1

解决方法:

create PROCEDURE tests(tableName varchar(20)) 
-- 创建存储过程 命名为tests

BEGIN   -- 存储过程的开始

  set @tableNames = CONCAT(tableName); 
  -- @先在用户变量中保存值然后在以后引用它

  set @sqlStr = CONCAT('select * from ', @tableNames);
  -- 拼接查询总记录的SQL语句 

  prepare stmt from @sqlStr; -- 预定义一个语句,并将它赋给 stmt

  execute stmt ; -- 执行语句

  deallocate prepare stmt;-- 要释放一个预定义语句的资源

END;  -- 存储过程的结束

到此mysql的动态sql实现变量表名就实现了,和正常的sql语句一样,执行,编译通过!!!~~~

下面我们来调用sql,测试存储过程:

call tests('background'); 

   ...  查询出background 表,数据我就不再展示了 

以上写的存储过程实际上就等价于这条语句:

select * from background; 

但是 他可以动态的传递一个表名当做变量,这样以后查询数据是不是变得更智能了呢 ~~~

以上是博主开发中遇到的一些个人总结,希望能帮助到大家,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值