存储过程函数中的动态表名称

Urb*_*coz 6 mysql stored-procedures

我编写了一个存储过程函数来从表中获取名称.问题是我希望将表名作为参数传入(我需要使用此函数的几个不同的表):

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
Run Code Online (Sandbox Code Playgroud)

此方法有错误,因为它使用变量名称"tableName"而不是变量的实际值.

我可以通过使用这样的方法在过程中解决此问题CONCAT:

    SET @GetName = CONCAT("
    SELECT
       'name'
    FROM
        ",tableName,"
    WHERE 
        id=",myId,";
    ");

    PREPARE stmt FROM @GetName;
    EXECUTE stmt;
Run Code Online (Sandbox Code Playgroud)

...但是,当我尝试在函数中执行此操作时,我会收到一条消息:

存储函数或触发器中不允许使用动态SQL

我尝试使用一个程序,但我不能让它只返回一个值,就像一个函数一样.

所以,任何人都可以看到解决这个问题的方法.它看起来非常基本.

Dev*_*art 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
Run Code Online (Sandbox Code Playgroud)

使用示例 -

SET @tableName = 'tbl';
SET @myId = 1005;
SET @name = NULL;
CALL getName(@tableName, @myId, @name);
SELECT @name;
Run Code Online (Sandbox Code Playgroud)