Você não pode parametrizar coluna/tabela/nome da função/alias. Como,
PREPARE
permite apenas que parte de "valores" da consulta SQL seja usada como parâmetros. Função/tabela/nome da coluna/alias são usados para determinar a validade da instrução SQL; e, portanto, não pode ser alterado durante a execução em tempo de execução. Alterá-lo em tempo de execução potencialmente alteraria se a instrução SQL era válida. Você pode pensar nisso como compilar um código; portanto, o compilador deve saber todos os nomes de funções/classes etc para criar um executável válido (sim, podemos fazer classes dinâmicas, mas isso é raro ). Por outro lado, podemos alterar os "valores" de entrada para o programa, mas geralmente não podemos alterar as operações a serem feitas nos dados de entrada.
Além disso, o servidor MySQL consideraria os parâmetros como literais e aplicaria aspas em torno deles, antes de usá-los na execução da consulta.
Agora, no seu caso, você ainda pode usar o nome da função como parâmetro para o procedimento armazenado e gerar a string de consulta usando isso. Mas você não pode usá-lo como parâmetro para a própria consulta.
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 ;