Nemůžete parametrizovat sloupec/tabulku/název funkce/alias. Jako, PREPARE
umožňuje jako parametry použít pouze část "hodnoty" SQL dotazu. Funkce/název/alias tabulky/sloupce se používají k určení platnosti příkazu SQL; a nelze je tedy během běhu měnit. Jeho změna v době provádění by potenciálně změnila, zda byl příkaz SQL platný.
Můžete si to představit jako kompilaci kódu; kompilátor proto musí znát všechny názvy funkcí/tříd atd., aby mohl vytvořit platný spustitelný soubor (ano, můžeme dělat dynamické třídy, ale to je vzácné ). Na druhou stranu můžeme změnit vstupní „hodnoty“ programu, ale obecně ne změnit operace, které mají být provedeny se vstupními daty.
Také by server MySQL považoval parametry za literály a použil je v uvozovkách, než je použije při provádění dotazu.
Nyní ve vašem případě můžete stále použít název funkce jako parametr pro uloženou proceduru a pomocí toho vygenerovat řetězec dotazu. Nemůžete jej však použít jako parametr pro samotný dotaz.
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 ;