Anda tidak bisa parametrize kolom/tabel/nama fungsi/alias. Sebagai, PREPARE
pernyataan hanya mengizinkan bagian "nilai" dari kueri SQL untuk digunakan sebagai parameter. Fungsi/Tabel/Nama kolom/alias digunakan untuk menentukan validitas pernyataan SQL; dan dengan demikian tidak dapat diubah selama eksekusi run-time. Mengubahnya pada waktu eksekusi berpotensi mengubah apakah pernyataan SQL itu valid.
Anda dapat menganggapnya sebagai kompilasi kode; maka kompiler harus mengetahui semua fungsi/nama kelas dll untuk membuat executable yang valid (ya, kita dapat melakukan kelas dinamis, tetapi itu jarang ). Di sisi lain, kita dapat mengubah input "nilai" ke program, tetapi umumnya tidak bisa ubah operasi yang akan dilakukan pada data input.
Selain itu, server MySQL akan mempertimbangkan parameter sebagai literal, dan menerapkan tanda kutip di sekitarnya, sebelum menggunakannya dalam eksekusi kueri.
Sekarang, dalam kasus Anda, Anda masih dapat menggunakan nama fungsi sebagai parameter untuk prosedur Tersimpan, dan menghasilkan string kueri menggunakan itu. Tetapi Anda tidak dapat menggunakannya sebagai parameter untuk kueri itu sendiri.
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 ;