Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przekazywanie nazwy kolumny jako parametru do procedury składowanej w mySQL

Musisz użyć dynamicznego 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;

Pamiętaj, że zgodnie z komentarzem Paula Spiegla , użycie zmiennej dla nazwy kolumny stwarza ryzyko iniekcji SQL. Jednym z rozwiązań poprawy bezpieczeństwa byłoby upewnienie się, że wejściowa col istnieje w tabeli docelowej, używając schematu informacyjnego 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie dwóch tabel o różnej liczbie kolumn

  2. Django + MySQL - Strona administracyjna - Dodaj użytkownika - OperationalError - SAVEPOINT nie istnieje

  3. pobierz wartości tabeli sql do ponownego wykorzystania w trybie offline

  4. Ponowne ładowanie zmiennych .env bez restartu serwera (Laravel 5, hosting współdzielony)

  5. JDBC PreparedStatement powoduje błąd składni MySQL