我编写了一个存储过程函数来从表中获取名称。麻烦的是我希望将表名作为参数传入(我需要使用此函数的几个不同的表):
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
这样在过程中解决此问题:
SET @GetName = CONCAT("
SELECT
'name'
FROM
",tableName,"
WHERE
id=",myId,";
");
PREPARE stmt FROM @GetName;
EXECUTE stmt;
...但是,当我尝试在一个函数中执行此操作时,我会收到一条消息:
存储函数或触发器
中不允许使用动态SQL
我尝试使用过程,但我无法让它返回一个值,就像函数一样。
所以,任何人都可以找到解决这个问题的方法。它看起来非常基本。
答案 0 :(得分:13)
如果要使用标识符来扩展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;
答案 1 :(得分:0)
我同意我们可以将存储过程与OUT参数一起使用,但如果我们为web应用程序创建此存储过程,那么该怎么办。其他实例将使用相同的过程并更改此OUT变量。在mysql中,OUT变量就像全局变量。一个实例将改变其值,在我们的程序读取其值之前,它将由Web上的另一个实例更改。另一种解决方案是什么?我面临同样的问题,我希望有返回值+我想使用动态表名。