Если вы пишете процедуру с более чем одним оператором в теле, вам нужно использовать BEGIN...END
.
CREATE PROCEDURE addItemToRepository(IN name VARCHAR(50), IN rfid VARCHAR(20),
IN type VARCHAR(20), IN manufacturer INT, IN model VARCHAR(30), IN toRent TINYINT)
NOT DETERMINISTIC MODIFIES SQL DATA SECURITY DEFINER
BEGIN
SET @typeid = (SELECT id FROM dictionary WHERE value = type LIMIT 1);
INSERT INTO depository (name, rfidtag, type, manufacturer, model, torent)
VALUES (name, rfid, @typeid, manufacturer, model, torent);
END
Примечание. Я изменил select(@typeid)
в вашем операторе вставки.Нет необходимости использовать select, и вы все равно не можете сделать это, не помещая его в подзапрос в скобках.
У меня есть еще несколько комментариев:
Убедитесь, что вашИмена параметров IN отличаются от имен ваших столбцов, иначе вы можете создать неоднозначные операторы SQL, то есть MySQL не знает, имеете ли вы в виду manufacturer
параметр in или manufacturer
столбец в таблице хранилища.Это не ошибка, но он может вставить NULL, потому что он использует manufacturer
из несуществующей строки.Поэтому я предлагаю привычку именовать параметры с префиксом типа «p», указывающим параметр.
Объявляйте локальную переменную вместо использования переменных сеанса.MySQL обрабатывает их по-разному.
Попробуйте использовать альтернативный синтаксис INSERT...SET
.
Вот мое предложение:
CREATE PROCEDURE addItemToRepository(IN pName VARCHAR(50), IN pRfid VARCHAR(20),
IN pType VARCHAR(20), IN pManufacturer INT, IN pModel VARCHAR(30), IN pToRent TINYINT)
NOT DETERMINISTIC MODIFIES SQL DATA SECURITY DEFINER
BEGIN
DECLARE vTypeid INT;
SELECT id INTO vTypeid FROM dictionary WHERE value = pType LIMIT 1;
INSERT INTO depository
SET name = pName,
rfidtag = pRfid,
type = vTypeid,
manufacturer = pManufacturer,
model = pModel,
toRent = pToRent;
END