我已经编写了一个存储过程函数来从表中获取名称。麻烦的是,我希望将表名作为参数传递(我需要使用几个不同的表来使用此函数):
DELIMITER $$ CREATE DEFINER=`root`@`localhost` FUNCTION `getName`(tableName VARCHAR(50), myId INT(11)) RETURNS VARCHAR(50) begin DECLARE myName VARCHAR(50); SELECT 'name' INTO myName FROM tableName WHERE id=myId; RETURN myName; end
此方法有一个错误,因为它使用变量名“ tableName”而不是变量的实际值。
我可以解决此问题的 方法 通过使用CONCAT这样的:
CONCAT
SET @GetName = CONCAT(" SELECT 'name' FROM ",tableName," WHERE id=",myId,"; "); PREPARE stmt FROM @GetName; EXECUTE stmt;
…但是,当我尝试在函数中执行此操作时,我收到一条消息,提示:
存储函数或触发器中不允许使用动态SQL
我尝试使用 过程 代替,但是我不能像函数一样让它仅仅返回一个值。
因此,任何人都可以找到解决此问题的方法。看起来真的非常基础。
如果要使用标识符构建SQL语句,则需要使用准备好的语句。但是准备好的语句不能在函数中使用。因此,您可以使用OUT参数创建存储过程-
CREATE PROCEDURE getName (IN tableName VARCHAR(50), IN myId INT(11), OUT myName VARCHAR(50)) BEGIN SET @GetName = CONCAT('SELECT name INTO @var1 FROM ', tableName, ' WHERE id=', myId); PREPARE stmt FROM @GetName; EXECUTE stmt; SET myName = @var1; END
使用示例-
SET @tableName = 'tbl'; SET @myId = 1005; SET @name = NULL; CALL getName(@tableName, @myId, @name); SELECT @name;