функции запуска sql — Ошибка «возвращено более одной строки»

#sql #postgresql #function #triggers

#sql #postgresql #функция #триггеры

Вопрос:

Я создал базу данных postgresql с помощью pgadmin.
Мне нужен триггер / функции, который обрабатывает новые покупки:

purchases_ait срабатывает при добавлении в purchases ; проверяет запасы перед добавлением покупки в purchases таблицу и выдает исключение, если их недостаточно; если исключения нет, вычитает количество проданных из inventory и добавляет его в purchases .


Purchases.ait выдает сообщение об ошибке: more than one row is returned . Пожалуйста, скажите мне, почему это происходит. Я думаю, что это может быть связано с логическим упорядочением, таким как операторы if / then и / или begin / end. Но я не смог разобраться в этом. Помощь высоко ценится!

Purchases_ait: (Исходный create function код, код запуска)

 CREATE FUNCTION purchases_ait() 
   RETURNS TRIGGER 
   LANGUAGE PLPGSQL
AS
$$
BEGIN
    IF NEW.quantity > quantity 
    FROM public.inventory THEN 
    RAISE EXCEPTION 'We do not have that much of that item left.';
    END IF;
  UPDATE public.inventory
     SET quantity = quantity - NEW.quantity
   WHERE item_id = NEW.item_id;
   RETURN NEW;
END;
$$
--trigger code --
CREATE TRIGGER purchases_ait 
   AFTER INSERT
   ON public.purchases
   FOR EACH ROW
       EXECUTE PROCEDURE purchases_ait()
  

Комментарии:

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

2. Пожалуйста, вставьте ваш код, который вызывает этот триггер.

3. IF NEW.quantity > quantity FROM public.inventory недопустимый PL / pgSQL — Я удивлен, что ваша триггерная функция вообще компилируется. Пожалуйста, опубликуйте полный create function код, соответствующие create trigger инструкции и инструкцию SQL, которая запускает триггер

4. Вы пропустили, WHERE который вернул бы количество NEW.item_id и, следовательно, несколько строк.

5. Кунал, я добавил свое предложение where item_id = NEW.item_id; к оператору IF в моей первой функции, но я все еще получаю то же сообщение об ошибке

Ответ №1:

У меня получилось. Две проблемы были:

  • изменил его на BEFORE , а не на AFTER функцию
  • изменил его на FOR EACH STATEMENT , а не на FOR EACH ROW приложение