DELIMITER $$
CREATE PROCEDURE PlaceOrder(
IN user_id INT,
IN product_id INT,
IN quantity INT
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'Error: Transaction rolled back';
END;
START TRANSACTION;
-- 插入订单
INSERT INTO orders (user_id, product_id, quantity)
VALUES (user_id, product_id, quantity);
-- 扣减库存
UPDATE products
SET stock = stock - quantity
WHERE id = product_id AND stock >= quantity;
-- 检查库存是否足够
IF ROW_COUNT() = 0 THEN
ROLLBACK;
SELECT 'Error: Insufficient stock';
ELSE
COMMIT;
SELECT 'Order placed successfully';
END IF;
END$$
DELIMITER ;
--调用存储过程
CALL PlaceOrder(1, 100, 2);
场景2:定时任务(配合事件调度器):每天凌晨清理过期日志
CREATE PROCEDURE CleanupLogs()
BEGIN
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
END
-- 创建事件
CREATE EVENT DailyLogCleanup
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 00:00:00'
DO CALL CleanupLogs();
场景3:计算部门平均工资
DELIMITER $$
CREATE PROCEDURE CalculateDeptAvgSalary(
IN dept_id INT,
OUT avg_salary DECIMAL(10,2)
)
BEGIN
SELECT AVG(salary) INTO avg_salary
FROM employees
WHERE department_id = dept_id;
END$$
DELIMITER ;
-- 调用
CALL CalculateDeptAvgSalary(5, @avg);
SELECT @avg;