Du kan inte parametrisera kolumn/tabell/funktionsnamn/alias. Som, PREPARE
satsen tillåter endast att "värden" en del av SQL-frågan används som parametrar. Funktion/tabell/kolumnnamn/alias används för att fastställa SQL-satsens giltighet; och kan därför inte ändras under körning. Om du ändrar den vid körning kan det eventuellt ändras om SQL-satsen är giltig.
Du kan tänka på det som att kompilera en kod; därför måste kompilatorn känna till alla funktioner/klassnamn etc för att skapa en giltig körbar (ja, vi kan göra dynamiska klasser, men det är sällsynt ). Å andra sidan kan vi ändra indata "värden" till programmet, men kan i allmänhet inte ändra operationerna som ska utföras på indata.
MySQL-servern skulle också betrakta parametrarna som bokstavliga och applicera citattecken runt dem, innan de används för att köra frågor.
Nu, i ditt fall, kan du fortfarande använda funktionsnamnet som parameter för lagrad procedur och generera frågesträngen med den. Men du kan inte använda den som en parameter för själva frågan.
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 ;