MySQL如何创建可传入已存在表名、调用即返回记录的存储过程
MySQL动态表名查询存储过程实现方案
原有代码问题
你编写的存储过程无法达到预期效果,原因是MySQL静态SQL中不支持直接用参数作为表名、列名这类标识符。代码中select * from tname会被MySQL识别为查询名称为tname的表,而非使用你传入的参数值作为查询表名,因此执行时要么找不到tname表报错,要么查询到的是错误的表数据。
正确实现代码
使用MySQL动态SQL语法拼接并执行查询语句即可实现需求:
delimiter // create procedure pselect(in tname varchar(50)) begin -- 拼接查询语句 SET @query_sql = CONCAT('SELECT * FROM ', tname); -- 预处理SQL PREPARE stmt FROM @query_sql; -- 执行查询 EXECUTE stmt; -- 释放预处理资源 DEALLOCATE PREPARE stmt; end // delimiter ;
调用方式
和你原有调用逻辑一致,直接传入要查询的表名即可:call pselect('trainee');
注意事项
- 调用前请确保传入的表名是当前数据库中已经存在的合法表名,否则会抛出表不存在的执行错误
- 该实现未做SQL注入防护,如果存储过程开放给不可信的调用方使用,需要先对传入的
tname参数做合法性校验,例如先查询information_schema.TABLES确认表名存在且合法后再执行查询逻辑
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

