举一反三,融会贯通。
我们前两天学习了如何建立储存过程、定义游标,以及如何使用循环语句来逐条编辑检索出的信息。
那么今天,我们将结合上周所学所有内容,建立一个可以完成自动创建和填充新表的储存过程~
融会贯通
之前我们建立了一个可以根据手动输入的订单号和是否需要税金来计算订单总价的储存过程。今天,在这个基础上,我们来尝试着让它自动检索出所有的订单号后一并返回总价,并直接将其制成一张新的表格。
-- 创建储存过程
CREATE PROCEDURE 处理订单()
BEGIN
-- 定义一个本地变量“完成”,布尔值。
-- 0为未完成,1为完成。
DECLARE 完成 BOOLEAN DEFAULT 0;
-- 定义一个本地变量“订单”,以便后期储存检索出的订单编码。
DECLARE 订单 INT;
-- 定义一个本地变量“总”,用于储存计算所得的总价。
DECLARE 总 DECIMAL(8,2);
-- 定义游标"ordernumbers"。
DECLARE ordernumbers CURSOR
FOR
-- 从订单表中用于检索订单号
SELECT order_num FROM orders;
-- SQLSTATE(SQL状态) '02000'为SQL中未找到所需条件的状态,
-- 该情景下即为当REPEAT由于没有更多的行供循环而不能继续时。
-- 换言之,代表“检索完成”。(完成=1)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET 完成=1;
-- 创建一张新表,包含订单号和总计。
CREATE TABLE IF NOT EXISTS 订单合计(订单编码 INT, 总计 DECIMAL(8,2));
-- 打开游标
OPEN ordernumbers;
-- 开始循环将检索出的订单号保存至“订单”变量。
REPEAT
-- 利用上周所建的“计算总价”储存过程计算出订单在有税情况下的总价,
-- 并将结果保存至变量“总”。
FETCH ordernumbers INTO 订单;
CALL 计算总价(订单, 1, 总);
INSERT INTO 订单合计(订单编码, 总计)
VALUES(订单, 总);
UNTIL 完成 END REPEAT;
-- 关闭游标
CLOSE ordernumbers;
END//
储存过程创建完毕后,先CALL一下~
CALL 处理订单()//
接着来看看我们“自动创建”的新表:
SELECT * FROM 订单合计//
有没有觉得突然高大上了起来?
第一次发现MySQL写起来也有Python一般行云流水的风范~
小结
今天我们借助了一个完整案例学习了如何利用存储过程、游标、循环逐行处理以及存储过程调用其它存储过程来完成工作。
希望上文可以启发大家如何利用SQL的储存过程以及循环语句来增强工作效率,如果还是有什么疑问或是建议的话,欢迎留言询问~
祝各位学习愉快!