Nombres de tablas dinámicas en la función de procedimiento almacenado

He escrito una función de procedimiento almacenado para obtener un nombre de una tabla. El problema es que quiero que se pase el nombre de la tabla como un parámetro (hay varias tablas diferentes con las que necesito usar esta función):

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 

Este método tiene un error porque usa el nombre de la variable “tableName” en lugar del valor real de la variable.

Puedo solucionar este problema en un procedimiento usando un CONCAT como este:

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

… pero, cuando trato de hacer esto en una función, recibo un mensaje que dice:

SQL dynamic no está permitido en la función almacenada o disparador

Traté de usar un procedimiento en su lugar, pero no pude conseguir que devuelva un valor, como lo hace una función.

Entonces, ¿alguien puede ver una forma de evitar este problema? Parece increíblemente básico realmente.

Si desea agregar una statement SQL usando identificadores, entonces necesita usar declaraciones preparadas; pero las declaraciones preparadas no se pueden usar en funciones. Entonces, puede crear un procedimiento almacenado con el parámetro 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 

Usando el ejemplo –

 SET @tableName = 'tbl'; SET @myId = 1005; SET @name = NULL; CALL getName(@tableName, @myId, @name); SELECT @name; 

Estoy de acuerdo en que podemos usar el procedimiento almacenado con el parámetro OUT, pero ¿qué sucede si estamos creando este procedimiento de almacenamiento para la aplicación web donde no? de otras instancias utilizará el mismo procedimiento y cambiará esta variable OUT. En mysql, la variable OUT es como una variable global. Una instancia cambiará su valor y antes de que nuestro progtwig lea su valor, se cambiaría por otra instancia en la web. ¿Cuál es la otra solución? Estoy enfrentando el mismo problema, quiero tener un valor de retorno + Quiero usar el nombre de tabla dinámica.