Ваш if (idprod > 0)
, вероятно, лучше записать как if idprod is not null
, но idprod > 0
должен работать.
Я предполагаю, что ошибка именно здесь:
update warehouses set amount = whamount * new.amount;
У вас нет предложения WHERE в этом ОБНОВЛЕНИИ, поэтому вы будете изменять каждую строку в таблице. Вы можете использовать это вместо:
select amount into whamount from warehouses where product = idprod;
update warehouses set amount = whamount * new.amount where product = idprod;
или лучше, сделайте это с помощью одного ОБНОВЛЕНИЯ:
update warehouses set amount = amount * new.amount where product = idprod;
Если вы пойдете с последним, вам больше не понадобится whamount
в вашем разделе DECLARE.
Кроме того, я думаю, вы могли бы заменить ваши первые два SELECT на один SELECT. Эти два:
SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
SELECT ID INTO idprod from PRODUCTS where ID = idsupp;
можно заменить просто так:
select p.id into idprod
from products p
join suppliers s on p.id = s.product
where s.id = new.supplier;
и тогда вам тоже не понадобится idsupp
.
Что касается отладки, единственное, что я знаю, это отладка в стиле printf
с помощью raise notice
; например:
raise notice 'idprod is "%"', idprod;