Mysql
 sql >> Base de données >  >> RDS >> Mysql

Instruction de préparation MySql - est-il possible de paramétrer le nom de la colonne ou le nom de la fonction ?

Vous ne pouvez pas paramétrer colonne/table/fonction nom/alias. Comme, PREPARE autorise uniquement l'utilisation de la partie "valeurs" de la requête SQL comme paramètre. Les noms/alias de fonction/table/colonne sont utilisés pour déterminer la validité de l'instruction SQL ; et ne peut donc pas être modifié pendant l'exécution au moment de l'exécution. Le modifier au moment de l'exécution modifierait potentiellement la validité de l'instruction SQL.

Vous pouvez considérer cela comme la compilation d'un code ; par conséquent, le compilateur doit connaître tous les noms de fonctions/classes, etc. pour créer un exécutable valide (oui, nous pouvons créer des classes dynamiques, mais c'est rare ). D'un autre côté, nous pouvons modifier les "valeurs" d'entrée dans le programme, mais généralement pas modifier les opérations à effectuer sur les données d'entrée.

De plus, le serveur MySQL considérerait les paramètres comme des littéraux et appliquerait des guillemets autour d'eux avant de les utiliser dans l'exécution de la requête.

Maintenant, dans votre cas, vous pouvez toujours utiliser le nom de la fonction comme paramètre pour la procédure stockée et générer la chaîne de requête à l'aide de cela. Mais vous ne pouvez pas l'utiliser comme paramètre pour la requête elle-même.

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 ;