在MySQL存储过程(stored procedure)中,用参数传入的表名要用于SQL语句中,参考了多个资料,例如:
似乎都不可行,也许是MySQL版本问题。
所有文章的解决方案都是在存储过程中使用prepared statement,但是问题是:在MySQL命令行客户端输入prepared statement时,用?代表将在运行期间替代的内容,但是,在存储过程中是否允许使用问号?
经过在MySQL 5.0环境中测试,在存储过程中和在命令行环境下,prepared statement的用法是有些区别的,在存储过程中,使用问号似乎是多余的,帖子mysql存储过程使用接收到的参数做表名的问题的2楼回帖给了一个例子,直接用CONCAT函数构造出待执行的SQL语句,不用语句
EXECUTE stmt USING @tableName;
给prepared statement传入参数替代问号。
正如Stored Procedures in MySQL 5.0所说,在存储过程中使用prepared statement使用存储过程参数传来的表名或字段名就像一种trick,跟原来的用于命令行终端的prepared statement的意义已经大不相同。另外还要注意:
Note that a literal string expression or a user variable are the only ways you can specify the statement to be prepared. You cannot prepare a statement using an expression