Проблемы с хранимой процедурой - PullRequest
0 голосов
/ 03 февраля 2019

кто-нибудь может мне помочь с процедурой?

enter image description here

я получаю сообщение об ошибке:

enter image description here

Где проблема?

1 Ответ

0 голосов
/ 03 февраля 2019

Если вы пишете процедуру с более чем одним оператором в теле, вам нужно использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...