Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Instrução de preparação do MySql - é possível parametrizar o nome da coluna ou o nome da função?


Você não pode parametrizar coluna/tabela/nome da função/alias. Como, PREPARE permite apenas que parte de "valores" da consulta SQL seja usada como parâmetros. Função/tabela/nome da coluna/alias são usados ​​para determinar a validade da instrução SQL; e, portanto, não pode ser alterado durante a execução em tempo de execução. Alterá-lo em tempo de execução potencialmente alteraria se a instrução SQL era válida.

Você pode pensar nisso como compilar um código; portanto, o compilador deve saber todos os nomes de funções/classes etc para criar um executável válido (sim, podemos fazer classes dinâmicas, mas isso é raro ). Por outro lado, podemos alterar os "valores" de entrada para o programa, mas geralmente não podemos alterar as operações a serem feitas nos dados de entrada.

Além disso, o servidor MySQL consideraria os parâmetros como literais e aplicaria aspas em torno deles, antes de usá-los na execução da consulta.

Agora, no seu caso, você ainda pode usar o nome da função como parâmetro para o procedimento armazenado e gerar a string de consulta usando isso. Mas você não pode usá-lo como parâmetro para a própria consulta.
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 ;