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

mySQLのストアドプロシージャにパラメータとして列名を渡す

    動的SQLを使用する必要があります :

    DELIMITER //
    CREATE PROCEDURE myDB.edit_myTable(
        IN key CHAR(16), 
        IN col VARCHAR(100), 
        new_value  VARCHAR(200)
    )
    BEGIN
        SET @s = CONCAT(
            'UPDATE myDB.myTable SET `', 
             col, '` = ', QUOTE(new_value),
             ' WHERE key = ', QUOTE(key)
        );
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END
    //
    DELIMITER;
    

    Paul Spiegel がコメントしているように、注意してください 、列名に変数を使用すると、SQLインジェクションのリスクが発生します。セキュリティを向上させるための1つの解決策は、入力colを確認することです。 MySQL情報スキーマを使用してターゲットテーブルに存在します:

    DELIMITER //
    CREATE PROCEDURE myDB.edit_myTable(
        IN key CHAR(16), 
        IN col VARCHAR(100), 
        new_value  VARCHAR(200)
    )
    BEGIN
        DECLARE col_exists INT;
    
        SELECT COUNT(*) INTO col_exists 
        FROM  information_schema.COLUMNS
        WHERE TABLENAME = 'mytable' AND COLUMN_NAME = col;
    
        IF (col_exists != 1) THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = CONCAT('Column ', col, ' does not exist in table mytable');
        END IF;
    
        SET @s = CONCAT(
            'UPDATE myDB.myTable SET `', 
             col, '` = ', QUOTE(new_value),
             ' WHERE key = ', QUOTE(key)
        );
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END
    //
    DELIMITER;
    



    1. シーケンスからIDを生成するためのOracleTriggerのHIbernateの問題

    2. avgとgroupbyを使用したSQLクエリ

    3. mysqlエラー1025(HY000):'./foo'(errorno:150)の名前変更時のエラーはどういう意味ですか?

    4. MariaDB TXとは何ですか?新しいMariaDBMySQLフォークを管理する方法!