sql >> データベース >  >> RDS >> Mysql

MySqlプリペアドステートメント-列名または関数名をパラメータ化することは可能ですか?

    あなたはできません 列/テーブル/関数名/エイリアスをパラメータ化します。として、PREPARE ステートメントでは、SQLクエリの「値」部分のみをパラメータとして使用できます。関数/テーブル/列名/エイリアスは、SQLステートメントの有効性を判断するために使用されます。したがって、実行時の実行中に変更することはできません。実行時に変更すると、SQLステートメントが有効かどうかが変わる可能性があります。

    コードをコンパイルすることと考えることができます。したがって、コンパイラは、有効な実行可能ファイルを作成するために、すべての関数/クラス名などを知っている必要があります(はい、動的クラスを実行できますが、それはまれです )。一方、プログラムへの入力「値」を変更することはできますが、通常はできません 入力データに対して実行する操作を変更します。

    また、MySQLサーバーは、パラメーターをリテラルと見なし、クエリの実行で使用する前に、パラメーターを引用符で囲みます。

    これで、あなたの場合でも、ストアドプロシージャのパラメータとして関数名を使用し、それを使用してクエリ文字列を生成できます。ただし、クエリ自体のパラメータとして使用することはできません。

    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. カンマ区切りの文字列をmysqlの行に分割します

    2. IMAPとPHP-送信済みフォルダと受信トレイフォルダからすべてのメールを取得する

    3. PHP:MySQLBlobから直接<img>タグへの画像検索

    4. Moqを使用してMySQLデータベースに挿入クエリをモックする