Виене можете параметризира име на колона/таблица/функция/псевдоним. Като, PREPARE
израз позволява да се използва само част от "стойности" от SQL заявката като параметри. Функция/Таблица/Име на колона/псевдоним се използват за определяне на валидността на SQL израза; и по този начин не може да бъде променен по време на изпълнение по време на изпълнение. Промяната му по време на изпълнение потенциално би променила дали SQL изразът е валиден.
Можете да мислите за това като компилиране на код; следователно компилаторът трябва да знае всички имена на функция/клас и т.н., за да създаде валиден изпълним файл (да, можем да правим динамични класове, но това е рядко ). От друга страна, можем да променим входните "стойности" в програмата, но по принцип не можем променете операциите, които трябва да се извършват върху входните данни.
Също така MySQL сървърът ще разглежда параметрите като литерали и ще прилага кавички около тях, преди да ги използва при изпълнение на заявка.
Сега, във вашия случай, все още можете да използвате името на функцията като параметър за Съхранена процедура и да генерирате низа на заявката, използвайки това. Но не можете да го използвате като параметър за самата заявка.
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 ;