mysql的动态sql实现变量表名及占位符的使用
MySQL 在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况,如数据量很大的时候就会用到分表。通过在网上查了mysql 5.1以上的版本提供了prepare语句用于支持这种操作。参考http://blog.csdn.net/shark1682003/article/details/17785095博客的内容,完成了动态表名的查询。具体实现是通
·
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;
但是 他可以动态的传递一个表名当做变量,这样以后查询数据是不是变得更智能了呢 ~~~
以上是博主开发中遇到的一些个人总结,希望能帮助到大家,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!
更多推荐
已为社区贡献2条内容
所有评论(0)