Как создать хранимую процедуру SQL для вставки нескольких значений - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующий оператор, который принимает массив значений и сохраняет их в моем MySQL RDS:

INSERT INTO items (item_id, item_name, item_description) VALUES ?

Я использую это с AWS Appsync, который не предоставляет механизм экранирования для предотвращения инъекции, поэтому я хотел бы использовать хранимую процедуру в моей RDS для защиты от инъекции .

Этот оператор будет использоваться для создания нескольких элементов, поэтому в него будет передан массив значений.

Как я могу создать хранимую процедуру для вставки нескольких значений в таблицу? Я был отослан в следующем примере для оператора select с одним аргументом, но я не уверен, как применить это к более сложному случаю с несколькими аргументами, как в моем приведенном выше утверждении.

CREATE PROCEDURE listPets (IN type_param VARCHAR(200))
  BEGIN
     PREPARE stmt FROM 'SELECT * FROM Pets where type=?';
     SET @type = type_param;
     EXECUTE stmt USING @type;
     DEALLOCATE PREPARE stmt;
  END

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Если вы намеревались обновить существующую запись:

CREATE PROCEDURE LIST_Pets
(
    --These are the Variables/columns you need to enter data into to update
    @item_name VARCHAR(15),
    @item_description VARCHAR(30),

    --These are the variables used to get the correct record which needs update
    @item_id INT
)
AS
BEGIN
UPDATE TABLE type_param
SET item_name = ISNULL(item_name, @item_name)--if the item_name is null it will insert @item_name
SET item_description = ISNULL(item_description, @item_description)
WHERE item_id = @item_id
0 голосов
/ 13 января 2019
CREATE PROCEDURE listPets (IN p_itemid INT, IN p_itemname VARCHAR(200), 
      IN p_itemdesc VARCHAR(200))
BEGIN
    PREPARE stmt FROM 'INSERT INTO items (item_id, item_name, item_description) VALUES (?, ?, ?)';
    SET @id = p_itemid, @name = p_itemname, @description = p_itemdesc;
    EXECUTE stmt USING @id, @name, @description;
    DEALLOCATE PREPARE stmt;
END

См. Документы по ПОДГОТОВКА и ВЫПОЛНЕНИЕ .

Совет: вы можете использовать этот альтернативный синтаксис INSERT:

PREPARE stmt FROM 'INSERT INTO items SET item_id=?, item_name=?, item_description=?';

Это нестандартное расширение MySQL для SQL, облегчающее сопоставление столбцов и заполнителей ?. Но он не поддерживает многострочные вставки.

...