Mysql
 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;

Моля, имайте предвид, че, както е коментирано от Пол Шпигел , използването на променлива за име на колона създава риск от SQL инжекция. Едно решение за подобряване на сигурността би било да се уверите, че входът 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изпратите MySQL Database Data към MVC .NET уеб приложение

  2. Има ли начин за завъртане на редове към колони в MySQL, без да се използва CASE?

  3. Laravel 5.1 Миграция и засаждане Не може да съкрати таблица, посочена в ограничение за външен ключ

  4. json колона срещу множество колони

  5. Изтичане на MySQL заявката:(70100):Изпълнението на заявката беше прекъснато