我编写了一个存储过程。它的工作正常,除了需要将表名作为输入参数。
让我们来看看我在MySQL中的存储过程:
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'不存在
为什么只有表参数会出现这种情况?如何从这个错误中恢复或者
我如何将表名作为参数传递给存储过程?
atable where (1=1) union all select username from mysql.user; '--
或类似的语句。我会创建一个名为“approvedtables”的表,并添加一个测试,例如select id into approvedid from approvedtables where tablename like newsinfotable limit 1
,只有在approved不为空时才执行动态查询。 - Johantest_proc
$$ CREATE DEFINER=root
@localhost
PROCEDUREtest_proc
(IN newsInfoTable VARCHAR(100)) BEGINSET @sql_stam = CONCAT('SELECT news INTO ', @news,' FROM ',newsInfoTable,' WHERE ',CURDATE(),'=?;');
PREPARE s1 FROM @sql_stam;
SET @where_param = DATE_FORMAT(date_time,'%Y-%m-%d');
EXECUTE s1 USING @where_param;
SELECT @news;
END$$ DELIMITER ; - riad