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

Mysql 存储过程函数中的动态表名,mysql,stored-procedures,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 my

我编写了一个存储过程函数来从表中获取名称。问题在于,我希望将表名作为参数传入。有几个不同的表需要与此函数一起使用:

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

我试着用一个过程来代替,但我不能让它像函数那样只返回一个值


那么,谁能想出一个办法来解决这个问题呢。它看起来非常基本。

如果您想使用标识符构建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;

使用OUT或INOUT参数覆盖返回值的过程如何?您好,我想为下面的嵌套查询创建一个过程。从表格名称中删除,其中id不在从hrs\U demo\U data\U引用中选择引用id,其中demo\U data\U记录中选择id,从hrs\U demo\U data\U记录中删除id,其中表格名称='tableName',并从表格名称中选择id中引用id此表名中的公司详细信息id=1将是动态的。你能帮我吗?