Вы не можете параметризовать столбец / таблицу / имя функции / псевдоним. Так как оператор 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 ;