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; 

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

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

你可能感兴趣的:(数据库,JavaWeb开发)