sql >> Databáze >  >> RDS >> Mysql

Příkaz přípravy MySql - je možné parametrizovat název sloupce nebo název funkce?

Nemůžete parametrizovat sloupec/tabulku/název funkce/alias. Jako, PREPARE umožňuje jako parametry použít pouze část "hodnoty" SQL dotazu. Funkce/název/alias tabulky/sloupce se používají k určení platnosti příkazu SQL; a nelze je tedy během běhu měnit. Jeho změna v době provádění by potenciálně změnila, zda byl příkaz SQL platný.

Můžete si to představit jako kompilaci kódu; kompilátor proto musí znát všechny názvy funkcí/tříd atd., aby mohl vytvořit platný spustitelný soubor (ano, můžeme dělat dynamické třídy, ale to je vzácné ). Na druhou stranu můžeme změnit vstupní „hodnoty“ programu, ale obecně ne změnit operace, které mají být provedeny se vstupními daty.

Také by server MySQL považoval parametry za literály a použil je v uvozovkách, než je použije při provádění dotazu.

Nyní ve vašem případě můžete stále použít název funkce jako parametr pro uloženou proceduru a pomocí toho vygenerovat řetězec dotazu. Nemůžete jej však použít jako parametr pro samotný dotaz.

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 ;



  1. Zachycování varování MySQL v Pythonu

  2. Dotaz k prohledání všech balíčků na tabulku a/nebo sloupec

  3. Vraťte Unixové časové razítko v PostgreSQL

  4. Je porovnávání řetězců v MySQL citlivé na útoky načasování?