DELIMITER //
CREATE FUNCTION GetAveragePriceInOrder(p_order_id INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE avg_price DECIMAL(10,2);
-- Вычисляем среднюю цену товаров в заказе
SELECT AVG(p.price) INTO avg_price
FROM order_items oi
JOIN products p ON oi.product_id = p.id
WHERE oi.order_id = p_order_id;
-- Если в заказе нет товаров, возвращаем 0
IF avg_price IS NULL THEN
RETURN 0;
ELSE
RETURN avg_price;
END IF;
END //
DELIMITER ;
DELIMITER //
CREATE PROCEDURE UpdateCustomerDiscountByOrder(IN p_order_id INT)
BEGIN
DECLARE v_avg_price DECIMAL(10,2);
DECLARE v_customer_id INT;
DECLARE v_current_discount DECIMAL(5,2);
-- Получаем ID клиента из заказа (используем JOIN)
SELECT o.customer_id INTO v_customer_id
FROM orders o
WHERE o.id = p_order_id;
-- Если заказ не найден, выходим
IF v_customer_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Order not found';
END IF;
-- Вызываем функцию для получения средней цены товаров в заказе
SET v_avg_price = GetAveragePriceInOrder(p_order_id);
-- Условная конструкция: если средняя цена > 70000
IF v_avg_price > 70000 THEN
-- Получаем текущую скидку клиента (SELECT INTO)
SELECT discount INTO v_current_discount
FROM customers
WHERE id = v_customer_id;
-- Увеличиваем скидку на 5%
UPDATE customers
SET discount = v_current_discount + 5
WHERE id = v_customer_id;
-- Выводим информационное сообщение
SELECT CONCAT('Скидка увеличена. Новая скидка: ',
v_current_discount + 5, '%') AS Message;
ELSE
-- Сообщение, если условие не выполнено
SELECT CONCAT('Средняя цена (', v_avg_price,
') не превышает 70000. Скидка не изменена.') AS Message;
END IF;
END //
DELIMITER ;