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

MySql prepare statement - er det muligt at parametrisere kolonnenavn eller funktionsnavn?

Du kan ikke parametriser kolonne/tabel/funktionsnavn/alias. Som, PREPARE sætningen tillader kun "værdier"-del af SQL-forespørgslen at blive brugt som parametre. Funktion/tabel/kolonnenavn/alias bruges til at bestemme gyldigheden af ​​SQL-sætningen; og kan derfor ikke ændres under kørslens udførelse. Ændring af den på udførelsestidspunktet ville potentielt ændre, om SQL-sætningen var gyldig.

Du kan tænke på det som at kompilere en kode; derfor skal compileren kende alle funktioner/klassenavne osv. for at skabe en gyldig eksekverbar (ja, vi kan lave dynamiske klasser, men det er sjældent ). På den anden side kan vi ændre input "værdier" til programmet, men kan generelt ikke ændre de handlinger, der skal udføres på inputdataene.

MySQL-serveren ville også betragte parametrene som bogstavelige og anvende anførselstegn omkring dem, før de blev brugt til udførelse af forespørgsler.

Nu, i dit tilfælde, kan du stadig bruge funktionsnavnet som parameter for Lagret procedure og generere forespørgselsstrengen ved hjælp af det. Men du kan ikke bruge det som en parameter for selve forespørgslen.

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. Opret HTML-tabel med SQL FOR XML

  2. AVG() Funktion i MariaDB

  3. Django:tilladelse nægtet ved forsøg på at få adgang til databasen efter gendannelse (migrering)

  4. MySQL LOG() Funktion – Returnerer den naturlige logaritme af en værdi