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

ストアドプロシージャのmysql動的クエリ

    エラーコード:1054。「where句」の不明な列「SPA」

    これは、入力文字列を引用符で囲まず、SQLエンジンがそれをクエリ対象のテーブルの列として識別しようとした場合に発生します。しかし、それが見つからないため失敗します。

    しかし、そのような列が見つかるとどうなりますか?
    列の値に一致するものが見つかると、結果がフェッチされます。
    明らかに、これは期待したものではありません。

    これを克服する方法は?動的入力値でプリペアドステートメントを使用します。

    ?のようなプレースホルダーを使用できます Prepared Statementsで使用する動的入力値のストアドプロシージャでも 。エンジンは、SQL式に割り当てられたとき、またはSQL式内で比較されたときに、エスケープ文字やその他の文字列値を処理します。

    必要に応じて、プロシージャ入力を1つ以上のセッション変数に再割り当てする必要があります。

    手順の例

    CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
    BEGIN
      SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
      SET @w_team := w_team;
    
      PREPARE stmt3 FROM @t1;
      EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
      DEALLOCATE PREPARE stmt3;
    END;
    


    1. エンティティフレームワーク6にMySQL接続を使用できません

    2. oracle sql:存在する場合は更新、そうでない場合は挿入

    3. インデックスのDOとDONT

    4. クエリ実行時間のpsycopg2ログを取得するにはどうすればよいですか?