Bạn không thể tham số hóa cột / bảng / tên hàm / bí danh. Như, PREPARE
câu lệnh chỉ cho phép một phần "giá trị" của truy vấn SQL được sử dụng làm tham số. Chức năng / Bảng / Tên cột / bí danh được sử dụng để xác định tính hợp lệ của câu lệnh SQL; và do đó không thể thay đổi trong quá trình thực thi thời gian chạy. Việc thay đổi nó tại thời điểm thực thi sẽ có khả năng thay đổi liệu câu lệnh SQL có hợp lệ hay không.
Bạn có thể coi nó giống như việc biên dịch một đoạn mã; do đó trình biên dịch phải biết tất cả (các) tên hàm / lớp, v.v. để tạo tệp thực thi hợp lệ (vâng, chúng tôi có thể tạo các lớp động, nhưng điều đó là hiếm ). Mặt khác, chúng ta có thể thay đổi "giá trị" đầu vào cho chương trình, nhưng nói chung là không thể thay đổi các hoạt động sẽ được thực hiện trên dữ liệu đầu vào.
Ngoài ra, máy chủ MySQL sẽ coi các tham số là các ký tự và áp dụng các dấu ngoặc kép xung quanh chúng, trước khi sử dụng chúng trong thực thi truy vấn.
Bây giờ, trong trường hợp của bạn, bạn vẫn có thể sử dụng tên hàm làm tham số cho thủ tục Đã lưu trữ và tạo chuỗi truy vấn bằng cách sử dụng tên đó. Nhưng bạn không thể sử dụng nó làm tham số cho chính truy vấn.
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 ;