Vous ne pouvez pas paramétrer colonne/table/fonction nom/alias. Comme, PREPARE
autorise uniquement l'utilisation de la partie "valeurs" de la requête SQL comme paramètre. Les noms/alias de fonction/table/colonne sont utilisés pour déterminer la validité de l'instruction SQL ; et ne peut donc pas être modifié pendant l'exécution au moment de l'exécution. Le modifier au moment de l'exécution modifierait potentiellement la validité de l'instruction SQL.
Vous pouvez considérer cela comme la compilation d'un code ; par conséquent, le compilateur doit connaître tous les noms de fonctions/classes, etc. pour créer un exécutable valide (oui, nous pouvons créer des classes dynamiques, mais c'est rare ). D'un autre côté, nous pouvons modifier les "valeurs" d'entrée dans le programme, mais généralement pas modifier les opérations à effectuer sur les données d'entrée.
De plus, le serveur MySQL considérerait les paramètres comme des littéraux et appliquerait des guillemets autour d'eux avant de les utiliser dans l'exécution de la requête.
Maintenant, dans votre cas, vous pouvez toujours utiliser le nom de la fonction comme paramètre pour la procédure stockée et générer la chaîne de requête à l'aide de cela. Mais vous ne pouvez pas l'utiliser comme paramètre pour la requête elle-même.
delimiter $$
create procedure test(in func varchar(20), in col varchar(20))
begin
set @c = col;
-- use concat function to generate the query string using func parameter
set @sql = concat('select ', func, '(?) from table');
-- prepare the statement
prepare stmt from @sql;
-- execute
execute x using @c;
-- don't forget to deallocate the prepared statement
deallocate prepare stmt;
end$$
delimiter ;