Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truyền tên cột làm tham số cho một thủ tục được lưu trữ trong mySQL

Bạn sẽ cần sử dụng SQL động :

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;

Xin lưu ý rằng, như nhận xét của Paul Spiegel , việc sử dụng một biến cho tên cột sẽ tạo ra nguy cơ bị chèn SQL. Một giải pháp để cải thiện bảo mật là đảm bảo rằng đầu vào col tồn tại trong bảng đích, sử dụng lược đồ thông tin 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 ném lỗi giá trị chuỗi không chính xác

  2. MySQL so sánh chuỗi DATE với chuỗi từ trường DATETIME

  3. Làm cách nào để thêm hàm levenshtein trong mysql?

  4. B-Tree vs Bash Table

  5. Ruby:mysql2-Gem không hoạt động (Mac OS X Snow Leopard, Ruby 1.9.2)