Non puoi parametrizza colonna/tabella/nome funzione/alias. Come, PREPARE
consentono solo di utilizzare come parametri la parte "valori" della query SQL. Funzione/Tabella/Nome colonna/alias vengono utilizzati per determinare la validità dell'istruzione SQL; e quindi non può essere modificato durante l'esecuzione in fase di esecuzione. La modifica al momento dell'esecuzione potrebbe potenzialmente alterare la validità dell'istruzione SQL.
Puoi pensarlo come compilare un codice; quindi il compilatore deve conoscere tutti i nomi di funzioni/classi ecc. per creare un eseguibile valido (sì, possiamo fare classi dinamiche, ma questo è raro ). D'altra parte, possiamo modificare i "valori" di input nel programma, ma generalmente non possiamo modificare le operazioni da fare sui dati di input.
Inoltre, il server MySQL considererebbe i parametri come valori letterali e applicherebbe virgolette attorno ad essi, prima di utilizzarli nell'esecuzione della query.
Ora, nel tuo caso, puoi ancora utilizzare il nome della funzione come parametro per la stored procedure e generare la stringa di query utilizzando quello. Ma non puoi usarlo come parametro per la query stessa.
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 ;