あなたはできません 列/テーブル/関数名/エイリアスをパラメータ化します。として、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 ;