sql decimal转int_SQL之游标定义(二)

4a952dccb32fd9e7d9b9b6d92a67294f.png

举一反三,融会贯通。

我们前两天学习了如何建立储存过程、定义游标,以及如何使用循环语句来逐条编辑检索出的信息。

那么今天,我们将结合上周所学所有内容,建立一个可以完成自动创建和填充新表的储存过程~

融会贯通

之前我们建立了一个可以根据手动输入的订单号和是否需要税金来计算订单总价的储存过程。今天,在这个基础上,我们来尝试着让它自动检索出所有的订单号后一并返回总价,并直接将其制成一张新的表格。

-- 创建储存过程
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 订单合计//

3b23a879453c503c63b3bfea71b56ac6.png

有没有觉得突然高大上了起来?

6be009540ea4c83f568cb75641f8d6dd.png

第一次发现MySQL写起来也有Python一般行云流水的风范~

0e1f292eb5dafbbe7460f7ec696404c8.png

小结

今天我们借助了一个完整案例学习了如何利用存储过程、游标、循环逐行处理以及存储过程调用其它存储过程来完成工作。


希望上文可以启发大家如何利用SQL的储存过程以及循环语句来增强工作效率,如果还是有什么疑问或是建议的话,欢迎留言询问~

祝各位学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值