内容简介
上班期间接到一个需要用存储过程完成的需求,由于之前没有接触过存储过程,数据库也仅限于简单使用,所以在此分享sql语句以及一些简单使用,顺便纪念一下第一次写的存储过程语句。有写的不好的地方欢迎大家指正
存储过程
1.具体需求
线路对应的费率中的底价改为原来底价的0.9折,四舍五入保留两位小数。
2.分析
分析:相关的表有operation_route – 线路表 , operation_route_revision – 版本记录表 , route_rate – 费率表 , operation_route_revision作为线路和费率的桥表
首先不能改原来定义的数据和他们的关联关系, 所以 实际操作就是要在原来的基础上 将原来线路对应的 版本–费率 重新生成一份,并且创建新的关联关系3.思路
遍历op_route 通过该线路关联的 revision_id 对应 op_route_revision 在 对应 route_rate 复制这两条记录,并且做出修改,更新操作.需要修改的字段有:
当前线路的版本号revision_id改为 该线路对应的 版本复制以后的ID
该线路对应的版本中的 费率ID 修改为 对应的 费率更新后的 费率ID
对应费率的 MinPrice 改为 ListPrice*0.9 取小数点后两位
2.具体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79DELIMITER $$
drop procedure if exists `route_rate_update`$$
CREATE
PROCEDURE `route_rate_update`()
BEGIN
/* 异常值 */
DECLARE Done INT DEFAULT 0;
/* 线路ID */
DECLARE routeId INT;
/* 版本ID */
DECLARE revisionId INT;
/* 费率ID */
DECLARE rateId INT;
/* 复制后的版本ID */
DECLARE newRevisionId INT;
/* 复制后的费率ID */
DECLARE newRateId INT;
/* 声明op_route表的游标 并查询线路ID,版本ID两个字段值待用 */
DECLARE opRoute CURSOR FOR SELECT op_route_id, revision_id FROM `operation_route` ort where ort.DELETED = 0 and ort.op_route_id in (8,9);
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
/* 打开游标 */
OPEN opRoute;
/* 遍历线路表 */
REPEAT
/* 逐个取出游标中查询的字段 */
FETCH opRoute INTO routeId, revisionId;
/* 如果无异常 */
IF NOT Done THEN
/* 逻辑处理 */
-- SELECT routeId;
-- SELECT revisionId;
/* 复制一条 线路ID对应的版本记录 */
insert into `operation_route_revision` (`op_route_id`, `op_route_name`, ......)
select `op_route_id`, `op_route_name`, ......;
/* 获取自增版本记录的ID并赋值 */
select last_insert_id() into newRevisionId;
/* 查询线路对应的版本同时关联的费率记录ID,并赋值给rateId */
select ortv.RATE_ID from `operation_route_revision` ortv where ortv.REVISION_ID = revisionId into rateId;
/* 复制一条 线路对应的版本同时关联的费率记录,对相应的字段进行修改 */
INSERT INTO `route_rate` (`ROUTE_ID`, ......
FROM `route_rate` WHERE `RATE_ID` = rateId ;
/* 获取自增费率记录的ID并赋值 */
SELECT LAST_INSERT_ID() INTO newRateId;
/* 更新新增的版本记录中的费率ID */
update `operation_route_revision` ortv set ortv.RATE_ID = newRateId where ortv.REVISION_ID = newRevisionId;
/* 更新线路中关联的版本记录ID */
UPDATE `operation_route` ort SET ort.revision_id = newRevisionId where ort.op_route_id = routeId;
-- select newRevisionId;
END IF;
/* 循环终止条件 */
UNTIL Done END REPEAT;
/* 关闭游标 */
CLOSE opRoute;
END$$
DELIMITER ;
写的时候,结合网上前辈们的记录,直到最后完成,还是有一点成就感的,或许这就是代码的魅力了……
本文作者: little dragon
本文链接: 2017/08/06/存储过程--首次尝试/
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。