小编典典

MySQL存储过程不使用表名作为参数

mysql

我已经写了一个存储过程。除了将表名作为输入参数之外,它都工作正常。

让我们在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 ;

存储过程的调用参数:

USE db_test;
CALL test_proc('abc','tbl_test_news');

在这里,服务名称参数可以正常工作。但是,如果我将newsInfoTable变量作为表输入参数包括在内,则会显示错误。

表’db_test.newsinfotable’不存在

为什么只对表参数发生这种情况?如何从此错误中检索或

如何将表名作为参数传递给存储过程?


阅读 322

收藏
2020-05-17

共1个答案

小编典典

无法使用动态表名优化SP,因此许多数据库(包括MySQL)不允许动态指定表名。

解决此问题的一种方法是使用动态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$$
2020-05-17