Mysql
 sql >> Database >  >> RDS >> Mysql

Istruzione MySql prepare:è possibile parametrizzare il nome della colonna o il nome della funzione?

Non puoi parametrizza colonna/tabella/nome funzione/alias. Come, PREPARE consentono solo di utilizzare come parametri la parte "valori" della query SQL. Funzione/Tabella/Nome colonna/alias vengono utilizzati per determinare la validità dell'istruzione SQL; e quindi non può essere modificato durante l'esecuzione in fase di esecuzione. La modifica al momento dell'esecuzione potrebbe potenzialmente alterare la validità dell'istruzione SQL.

Puoi pensarlo come compilare un codice; quindi il compilatore deve conoscere tutti i nomi di funzioni/classi ecc. per creare un eseguibile valido (sì, possiamo fare classi dinamiche, ma questo è raro ). D'altra parte, possiamo modificare i "valori" di input nel programma, ma generalmente non possiamo modificare le operazioni da fare sui dati di input.

Inoltre, il server MySQL considererebbe i parametri come valori letterali e applicherebbe virgolette attorno ad essi, prima di utilizzarli nell'esecuzione della query.

Ora, nel tuo caso, puoi ancora utilizzare il nome della funzione come parametro per la stored procedure e generare la stringa di query utilizzando quello. Ma non puoi usarlo come parametro per la query stessa.

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 ;