Mysql存储过程不将表名作为参数

时间:2011-07-07 11:20:03

标签: 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 ;

存储过程调用参数:

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

此处服务名称参数正常工作。但是如果我将newsInfoTable变量包含为表输入参数,则会显示错误。

  

表'db_test.newsinfotable'不存在

为什么这只发生在table参数中?如何从此错误或

中检索

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

4 个答案:

答案 0 :(得分:8)

无法使用动态表名优化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$$

答案 1 :(得分:6)

你可以使用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

答案 2 :(得分:-1)

查询的那部分不能是动态的。

您可以考虑将其实现为在运行时动态执行的字符串

答案 3 :(得分:-1)

虽然可能不是您想要的,但也可以考虑有条件地使用if和准备声明。

DELIMITER $$
CREATE PROCEDURE select_count(IN table_name VARCHAR(20))
BEGIN
  IF table_name = 'xxx' THEN
     SELECT * FROM xxx;
  ELSEIF table_name = 'yyy' THEN
     ...
  ENDIF
END$$