Je kan niet parametriseer kolom/tabel/functienaam/alias. Als, PREPARE
statement staat alleen toe dat het "values"-gedeelte van de SQL-query als parameters wordt gebruikt. Functie/Tabel/Kolomnaam/alias worden gebruikt om de geldigheid van de SQL-instructie te bepalen; en kan dus niet worden gewijzigd tijdens runtime-uitvoering. Het wijzigen ervan tijdens de uitvoering zou mogelijk veranderen of de SQL-instructie geldig was.
Je kunt het zien als het compileren van een code; daarom moet de compiler alle functie-/klassenamen enz. kennen om een geldig uitvoerbaar bestand te maken (ja, we kunnen dynamische klassen doen, maar dat is zeldzaam ). Aan de andere kant kunnen we invoer "waarden" in het programma veranderen, maar in het algemeen niet verander de bewerkingen die moeten worden uitgevoerd op de invoergegevens.
Ook zou de MySQL-server de parameters als letterlijke waarden beschouwen en er aanhalingstekens omheen toepassen voordat ze worden gebruikt bij het uitvoeren van query's.
Nu kunt u in uw geval nog steeds de functienaam gebruiken als parameter voor de Opgeslagen procedure en daarmee de queryreeks genereren. Maar je kunt het niet gebruiken als parameter voor de query zelf.
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 ;