Du kan ikke parametriser kolonne/tabel/funktionsnavn/alias. Som, PREPARE
sætningen tillader kun "værdier"-del af SQL-forespørgslen at blive brugt som parametre. Funktion/tabel/kolonnenavn/alias bruges til at bestemme gyldigheden af SQL-sætningen; og kan derfor ikke ændres under kørslens udførelse. Ændring af den på udførelsestidspunktet ville potentielt ændre, om SQL-sætningen var gyldig.
Du kan tænke på det som at kompilere en kode; derfor skal compileren kende alle funktioner/klassenavne osv. for at skabe en gyldig eksekverbar (ja, vi kan lave dynamiske klasser, men det er sjældent ). På den anden side kan vi ændre input "værdier" til programmet, men kan generelt ikke ændre de handlinger, der skal udføres på inputdataene.
MySQL-serveren ville også betragte parametrene som bogstavelige og anvende anførselstegn omkring dem, før de blev brugt til udførelse af forespørgsler.
Nu, i dit tilfælde, kan du stadig bruge funktionsnavnet som parameter for Lagret procedure og generere forespørgselsstrengen ved hjælp af det. Men du kan ikke bruge det som en parameter for selve forespørgslen.
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 ;