sql >> Database >  >> RDS >> Mysql

MySql-statement voorbereiden - is het mogelijk om de kolomnaam of functienaam te parametreren?

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 ;



  1. Converteer OracleParameter.Value naar Int32

  2. Vermijd dead lock door expliciet te bestellen

  3. Hoe de juiste opvulling op de dagnaam in Oracle te verwijderen

  4. Het aantal rijen en gegevens van die rij in een enkele zoekopdracht krijgen met PDO in PHP