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

将列名作为MySql函数的参数传递,mysql,Mysql,我正在尝试编写MySql函数,如果我传递select语句中使用的表名,这是一个玩具代码,用于解释我面临的问题。[注意:我不想使用过程!] DROP FUNCTION IF EXISTS `P_AVG`; DELIMITER $$ CREATE FUNCTION P_AVG(tblName CHAR(64)) RETURNS INT BEGIN DECLARE cnt INT; SELECT COUNT(*) INTO cnt FROM tblName; return cnt; END$

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

DROP FUNCTION IF EXISTS `P_AVG`;
DELIMITER $$
CREATE FUNCTION P_AVG(tblName CHAR(64)) RETURNS INT
BEGIN 
    DECLARE cnt INT;
SELECT COUNT(*) INTO cnt FROM tblName;
return cnt;
END$$
DELIMITER ;
然后我试着执行以下命令

SELECT P_AVG("PARTSUPP");
我得到以下错误

错误1146(42S02):表“phpmyadmin.tblName”不存在


要在运行时选择表(需要使用准备好的语句),请将SQL创建为具有所需表名的字符串。请参见第三个示例:

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

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

这应该可以为您做到:-

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

它生成以下错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用“动态查询”的正确语法;o、 o另一个:错误1336(0A000):存储函数或触发器中不允许使用动态SQL,那么您需要将其作为存储过程编写。一个
过程
而不是
功能