Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
--заносим, если что-то осталось, на склад
update warehouse set count =
count + rscount - NEW.count
where goods_id = NEW.goods_id;
else
--зарезервировать не удалось – заносим соответствующие пометки
update orders set status = 'not reserved'
where order_id = NEW.order_id;
insert into orders_warnings(order_id,
message, date)
values(NEW.order_id,
'Товар по заказу не зарезервирован', now());
end if;
else
--уменьшаем количество на складе
update warehouse set count = count - NEW.count
where goods_id = NEW.goods_id;
--делаем запись в таблице резерва
insert into reserved(order_id, goods_id, count, date)
values(NEW.order_id, NEW.goods_id, NEW.count
NEW.date);
end if;
return NEW;
END;
Обратите внимание на применение нами переменной reserved%rowtype – она описывает запись таблицы reserved, которую мы в дальнейшем используем для организации цикла (конструкция «for row in select ... loop») по записям, выбранным из этой таблицы. С тем же успехом можно было бы использовать переменную типа RECORD, однако из-за меньшей скорости обработки этот тип рекомендуется задействовать только там, где переменная будет применяться при обработке нескольких таблиц или невозможно указать конкретную таблицу.
Аналогично переменная whcount описана с тем же типом, что и поле count таблицы warehouse. Конкретно в данном примере это сделано исключительно в целях демонстрации такой возможности. Но в реальных проектах типы некоторых полей в базе могут меняться по тем или иным соображениям (например, поле типа char, хранящее IP-адреса машин, может быть в будущем изменено на специальный тип inet), и использование привязки типа переменных к типу поля позволит избежать внесения правок во все разработанные функции.
И теперь создадим сам триггер, связывающий созданную выше функцию с операцией вставки новой записи в таблицу orders:
create trigger set_order after insert on orders