ria*_*iad 4 mysql stored-procedures
我写了一个存储过程.除了将表名作为输入参数之外,它工作正常.
让我在MySQL中查看我的proc:
DELIMITER $$
USE `db_test`$$
DROP PROCEDURE IF EXISTS test_proc$$
CREATE DEFINER=`root`@`localhost`
PROCEDURE `test_proc`(IN serviceName VARCHAR(10),IN newsInfoTable VARCHAR(100))
BEGIN
SELECT COUNT(*) FROM newsInfoTable WHERE newsServiceName=serviceName;
END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
存储过程调用参数:
USE db_test;
CALL test_proc('abc','tbl_test_news');
Run Code Online (Sandbox Code Playgroud)
这里服务名称参数工作正常.但是如果我将newsInfoTable变量包含为表输入参数,则会显示错误.
表'db_test.newsinfotable'不存在
为什么这只发生在table参数中?如何从此错误中检索或
我如何将表名作为参数传递给存储过程?
无法使用动态表名优化SP,因此包含MySQL的许多DB不允许动态指定表名.
解决此问题的一种方法是使用动态SQL.
CREATE DEFINER=`root`@`localhost` PROCEDURE `test_proc`(IN serviceName VARCHAR(10),IN newsInfoTable VARCHAR(100))
BEGIN
SET @sql = CONCAT('SELECT COUNT(*) FROM ',newsInfoTable,' WHERE newsServiceName=?;');
PREPARE s1 from @sql;
SET @paramA = serviceName;
EXECUTE s1 USING @paramA;
END$$
Run Code Online (Sandbox Code Playgroud)
您可以使用EXECUTE IMMEDIATE"少即是多"的解决方案(对我来说,代码少=好)
CREATE PROCEDURE test_proc(IN serviceName VARCHAR(10), IN newsInfoTable VARCHAR(100))
BEGIN
EXECUTE IMMEDIATE CONCAT('SELECT COUNT(*) FROM ',newsInfoTable,' WHERE newsServiceName=''', serviceName, '''');
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13648 次 |
| 最近记录: |