我正在使用存储过程并准备语句。我想发送参数来定义从选择语句返回的列。如果我使用会话变量并且不替换变量,则此方法有效。我可以解决这个问题,但我想了解这个问题。以下是示例:
这有效:
DELIMITER $$
DROP PROCEDURE IF EXISTS `pnlByTheme` $$
CREATE PROCEDURE `pnlByTheme`(IN param VARCHAR(50))
BEGIN
set @sqlStmt = concat("select ",param," from pnl_aggregate");
prepare stmt from @sqlStmt;
execute stmt;
deallocate prepare stmt;
END $$
DELIMITER ;
当我调用 pnlByTheme('label') 时,我从 pnl_aggregate 中获得选择标签的结果,就像从命令行中一样。如果我将 set 语句更改为:
set @sqlStmt = "select ? from pnl_aggregate";
然后我将执行语句更改为:
execute stmt using param;
mysql 不喜欢这样并且不会创建该过程。如果我改为:
DELIMITER $$
DROP PROCEDURE IF EXISTS `pnlByTheme` $$
CREATE PROCEDURE `pnlByTheme`(IN param VARCHAR(50))
BEGIN
set @p = param;
set @sqlStmt = "select ? from pnl_aggregate";
prepare stmt from @sqlStmt;
execute stmt using @p;
deallocate prepare stmt;
END $$
DELIMITER ;
这将创建程序。为什么?奇怪的是(对我来说,无论如何)是调用的结果
call pnlbytheme('label');
只是每一行的字面“标签”,而不是我正在寻找的实际数据。我可以使用 concat 轻松解决此问题,但想了解。请帮忙。