Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySql-Vorbereitungsanweisung - ist es möglich, den Spaltennamen oder den Funktionsnamen zu parametrisieren?

Das können Sie nicht Spalte/Tabelle/Funktionsname/Alias ​​parametrisieren. Als PREPARE -Anweisung erlauben nur die Verwendung des "values"-Teils der SQL-Abfrage als Parameter. Funktion/Tabelle/Spaltenname/Alias ​​werden verwendet, um die Gültigkeit der SQL-Anweisung zu bestimmen; und kann daher während der Ausführung zur Laufzeit nicht geändert werden. Eine Änderung zur Ausführungszeit würde möglicherweise ändern, ob die SQL-Anweisung gültig war.

Sie können sich das wie das Kompilieren eines Codes vorstellen; Daher muss der Compiler alle Funktions-/Klassennamen usw. kennen, um eine gültige ausführbare Datei zu erstellen (ja, wir können dynamische Klassen erstellen, aber das ist selten). ). Andererseits können wir Eingabe-"Werte" in das Programm ändern, aber im Allgemeinen nicht die auf den Eingabedaten auszuführenden Operationen ändern.

Außerdem würde der MySQL-Server die Parameter als Literale betrachten und sie in Anführungszeichen setzen, bevor er sie bei der Abfrageausführung verwendet.

In Ihrem Fall können Sie jetzt immer noch den Funktionsnamen als Parameter für die gespeicherte Prozedur verwenden und damit die Abfragezeichenfolge generieren. Sie können es jedoch nicht als Parameter für die Abfrage selbst verwenden.

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 ;