我正在尝试编写MySql函数,我在select语句中使用了表名,这是一个解释我面临的问题的玩具代码。[注意:我不想使用程序!]
SELECT P_AVG("PARTSUPP");
然后我尝试执行以下
create
我收到以下错误
ERROR 1146(42S02):表'phpmyadmin.tblName'不存在
答案 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