将列名称作为MySql函数的参数传递

时间:2016-01-04 11:32:02

标签: mysql

我正在尝试编写MySql函数,我在select语句中使用了表名,这是一个解释我面临的问题的玩具代码。[注意:我不想使用程序!]

SELECT P_AVG("PARTSUPP");

然后我尝试执行以下

create

我收到以下错误

  

ERROR 1146(42S02):表'phpmyadmin.tblName'不存在

2 个答案:

答案 0 :(得分:0)

要在运行时选择表 - 您需要使用预准备语句 - 将SQL创建为具有所需表名的字符串。请参阅第三个示例:http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

答案 1 :(得分:0)

创建一个全局变量来动态编写SQL查询,然后让MySQL从编写的SQL查询字符串中准备一个语句,并以预准备语句的形式动态执行它。

由于存储函数中不允许使用动态SQL,因此需要使用STORED PROCEDURE。

这应该适合你: -

DROP PROCEDURE IF EXISTS `P_AVG`;
DELIMITER $$
CREATE PROCEDURE P_AVG(tblName CHAR(64))
BEGIN   
  DECLARE cnt INT DEFAULT 0;
    IF CHAR_LENGTH(tblName) > 0 THEN 
       SET @DYNAMIC_QUERY = CONCAT('SELECT COUNT(*) INTO cnt FROM ', tblName);
       PREPARE STMNT FROM @DYNAMIC_QUERY;
       EXECUTE STMNT;
       DEALLOCATE PREPARE STMNT;
    END IF;
  SELECT cnt; /* The return statement becomes a regular `SELECT` statement, 
                 although an OUT parameter also can be used instead. */
END$$
DELIMITER ;

CALL P_AVG('ACCOUNT'); -- Example procedure call