面试题答案
一键面试实现思路
- 开启事务:确保整个操作的原子性,要么全部成功,要么全部回滚。
- 定义游标:用于遍历满足指定时间段条件的订单。
- 获取订单:在游标循环中,针对每个订单,统计其商品数量。
- 判断与更新:如果商品数量大于10,更新订单状态为'high_volume'。
- 关闭游标与提交事务:操作完成后关闭游标并提交事务,如果过程中出现错误则回滚事务。
SQL代码(以MySQL为例)
-- 开启事务
START TRANSACTION;
-- 定义变量
DECLARE done INT DEFAULT FALSE;
DECLARE cur_order_id INT;
DECLARE item_count INT;
-- 定义游标,获取指定时间段内的订单
DECLARE order_cursor CURSOR FOR
SELECT order_id
FROM orders
WHERE order_date BETWEEN '开始日期' AND '结束日期';
-- 定义游标结束标识
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN order_cursor;
-- 循环处理订单
order_loop: LOOP
-- 获取订单ID
FETCH order_cursor INTO cur_order_id;
-- 判断是否到达游标末尾
IF done THEN
LEAVE order_loop;
END IF;
-- 统计该订单的商品数量
SELECT COUNT(*) INTO item_count
FROM order_items
WHERE order_id = cur_order_id;
-- 如果商品数量大于10,更新订单状态
IF item_count > 10 THEN
UPDATE orders
SET status = 'high_volume'
WHERE order_id = cur_order_id;
END IF;
END LOOP order_loop;
-- 关闭游标
CLOSE order_cursor;
-- 提交事务
COMMIT;
请将代码中的'开始日期'
和'结束日期'
替换为实际的日期范围。