mysql存储过程游标与全局事务应用范例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

以下是我们所用到的一部分代码:

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
begin
     -- 定义事务变量
     declare  t_error  integer  default  0;
     declare  v_cerror  integer  default  0;
     -- 定义其他
     declare  v_count  int (11);
     -- 定义接收游标数据的变量
     declare  v_id  varchar (255);
     declare  v_create_date datetime;
     declare  v_del_flag  varchar (1);
     declare  v_remarks  varchar (255);
     declare  v_update_date datetime;
     declare  v_address  varchar (255);
     declare  v_appstate  varchar (255);
     declare  v_area_id  varchar (255);
     declare  v_belong  varchar (255);
     declare  v_borough_id  varchar (255);
     declare  v_borough_name  varchar (255);
     declare  v_broker_id  varchar (255);
     declare  v_check_name  varchar (255);
     declare  v_check_time  varchar (255);
     declare  v_consigner_id  varchar (255);
     declare  v_down_time  varchar (255);
     declare  v_draw_url  varchar (255);
     declare  v_house_age  varchar (255);
     declare  v_house_desc  varchar (255);
     declare  v_house_drawing  varchar (255);
     declare  v_house_feature  varchar (255);
     declare  v_house_fitment  varchar (255);
     declare  v_house_floor  varchar (255);
     declare  v_house_hall  varchar (255);
     declare  v_house_no  varchar (255);
     declare  v_house_price  double ;
     declare  v_house_room  varchar (255);
     declare  v_house_thumb  varchar (255);
     declare  v_house_title  varchar (255);
     declare  v_house_toilet  varchar (255);
     declare  v_house_topfloor  varchar (255);
     declare  v_house_totalarea  double ;
     declare  v_house_toward  varchar (255);
     declare  v_house_type  varchar (255);
     declare  v_house_veranda  varchar (255);
     declare  v_is_down  varchar (255);
     declare  v_is_promote  varchar (255);
     declare  v_is_synchro  varchar (255);
     declare  v_is_whether  varchar (255);
     declare  v_owner_name  varchar (255);
     declare  v_owner_notes  varchar (255);
     declare  v_owner_phone  varchar (255);
     declare  v_status  varchar (255);
     declare  v_submit_name  varchar (255);
     declare  v_submit_time  varchar (255);
     declare  v_synchro_time  varchar (255);
     declare  v_video  varchar (255);
     declare  v_whether_time  varchar (255);
     declare  v_create_by  varchar (255);
     declare  v_update_by  varchar (255);
     declare  v_area_name  varchar (255);
     declare  v_is_new  varchar (255);
     declare  v_log_flag  varchar (255);
     declare  v_log_status  varchar (255);
     declare  v_lot_NO  varchar (255);
   -- 遍历数据结束标志
     declare  done  int  default  false ;
   -- 游标
     declare  cur  cursor  for  select 
         `id`,`create_date`,`del_flag`,`remarks`,`update_date`,
         `address`,`appstate`,`area_id`,`belong`,`borough_id`,
         `borough_name`,`broker_id`,`check_name`,`check_time`,`consigner_id`,
         `down_time`,`draw_url`,`house_age`,`house_desc`,`house_drawing`,
         `house_feature`,`house_fitment`,`house_floor`,`house_hall`,`house_no`,
         `house_price`,`house_room`,`house_thumb`,`house_title`,`house_toilet`,
         `house_topfloor`,`house_totalarea`,`house_toward`,`house_type`,`house_veranda`,
         `is_down`,`is_promote`,`is_synchro`,`is_whether`,`owner_name`,
         `owner_notes`,`owner_phone`,`status`,`submit_name`,`submit_time`,
         `synchro_time`,`video`,`whether_time`,`create_by`,`update_by`,
         `area_name`,`is_new`,
         `log_flag`,`log_status`,`lot_NO` 
         from  zj_front_ihouse.zj_front_housesell_swp 
         where  lot_NO = p_lot_NO  and  (log_flag =  'i'  or  log_flag =  'd'  or  log_flag =  'u'
         order  by  update_date  asc ;
   -- 将结束标志绑定到游标
     declare  continue  handler  for  not  found  set  done =  true ;
     -- 事务错误默认值
     declare  continue  handler  for  sqlexception  set  t_error=1;
     -- 开启事务
     start  transaction ;
   -- 打开游标
   open  cur;
   -- 开始循环
   read_loop: loop
     -- 赋初始值
         set  v_id= '' ,v_create_date= '0000-01-01 00:00:00' ,v_del_flag= '' ,v_remarks= '' ,v_update_date= '0000-01-01 00:00:00' ,
                 v_address= '' ,v_appstate= '' ,v_area_id= '' ,v_belong= '' ,v_borough_id= '' ,
                 v_borough_name= '' ,v_broker_id= '' ,v_check_name= '' ,v_check_time= '' ,v_consigner_id= '' ,
                 v_down_time= '' ,v_draw_url= '' ,v_house_age= '' ,v_house_desc= '' ,v_house_drawing= '' ,
                 v_house_feature= '' ,v_house_fitment= '' ,v_house_floor= '' ,v_house_hall= '' ,v_house_no= '' ,
                 v_house_price=0.0,v_house_room= '' ,v_house_thumb= '' ,v_house_title= '' ,v_house_toilet= '' ,
                 v_house_topfloor= '' ,v_house_totalarea=0.0,v_house_toward= '' ,v_house_type= '' ,v_house_veranda= '' ,
                 v_is_down= '' ,v_is_promote= '' ,v_is_synchro= '' ,v_is_whether= '' ,v_owner_name= '' ,
                 v_owner_notes= '' ,v_owner_phone= '' ,v_status= '' ,v_submit_name= '' ,v_submit_time= '' ,
                 v_synchro_time= '' ,v_video= '' ,v_whether_time= '' ,v_create_by= '' ,v_update_by= '' ,
                 v_area_name= '' ,v_is_new= '' ,
                 v_log_flag =  '' ,v_log_status =  '' ,v_lot_NO =  '' ;
     -- 提取游标里的数据
         fetch  cur  into 
             v_id,v_create_date,v_del_flag,v_remarks,v_update_date,
             v_address,v_appstate,v_area_id,v_belong,v_borough_id,
             v_borough_name,v_broker_id,v_check_name,v_check_time,v_consigner_id,
             v_down_time,v_draw_url,v_house_age,v_house_desc,v_house_drawing,
             v_house_feature,v_house_fitment,v_house_floor,v_house_hall,v_house_no,
             v_house_price,v_house_room,v_house_thumb,v_house_title,v_house_toilet,
             v_house_topfloor,v_house_totalarea,v_house_toward,v_house_type,v_house_veranda,
             v_is_down,v_is_promote,v_is_synchro,v_is_whether,v_owner_name,
             v_owner_notes,v_owner_phone,v_status,v_submit_name,v_submit_time,
             v_synchro_time,v_video,v_whether_time,v_create_by,v_update_by,
             v_area_name,v_is_new,
             v_log_flag,v_log_status,v_lot_NO;
     -- 声明结束的时候
         if done  then
       leave read_loop;
         end  if;
     -- 这里做你想做的循环的事件
         set  v_count = ( select  count (*)  from  zj_front_ihouse.zj_front_housesell  where  id = v_id);
         if t_error = 1  then
             set  v_cerror = v_cerror + t_error;
             rollback ;
             leave read_loop;
         end  if;
         -- select v_count,v_log_flag;
         if v_log_flag =  'i'  then
             if v_count != 0  then
                 update  zj_front_ihouse.zj_front_housesell  set 
                 `id`=v_id,`create_date`=v_create_date,`del_flag`=v_del_flag,`remarks`=v_remarks,`update_date`=v_update_date,
                 `address`=v_address,`appstate`=v_appstate,`area_id`=v_area_id,`belong`=v_belong,`borough_id`=v_borough_id,
                 `borough_name`=v_borough_name,`broker_id`=v_broker_id,`check_name`=v_check_name,`check_time`=v_check_time,`consigner_id`=v_consigner_id,
                 `down_time`=v_down_time,`draw_url`=v_draw_url,`house_age`=v_house_age,`house_desc`=v_house_desc,`house_drawing`=v_house_drawing,
                 `house_feature`=v_house_feature,`house_fitment`=v_house_fitment,`house_floor`=v_house_floor,`house_hall`=v_house_hall,`house_no`=v_house_no,
                 `house_price`=v_house_price,`house_room`=v_house_room,`house_thumb`=v_house_thumb,`house_title`=v_house_title,`house_toilet`=v_house_toilet,
                 `house_topfloor`=v_house_topfloor,`house_totalarea`=v_house_totalarea,`house_toward`=v_house_toward,`house_type`=v_house_type,`house_veranda`=v_house_veranda,
                 `is_down`=v_is_down,`is_promote`=v_is_promote,`is_synchro`=v_is_synchro,`is_whether`=v_is_whether,`owner_name`=v_owner_name,
                 `owner_notes`=v_owner_notes,`owner_phone`=v_owner_phone,`status`=v_status,`submit_name`=v_submit_name,`submit_time`=v_submit_time,
                 `synchro_time`=v_synchro_time,`video`=v_video,`whether_time`=v_whether_time,`create_by`=v_create_by,`update_by`=v_update_by,
                 `area_name`=v_area_name,`is_new`=v_is_new
                 where  id = v_id;
                 if t_error = 1  then
                     set  v_cerror = v_cerror + t_error;
                     rollback ;
                     leave read_loop;
                 end  if;
             else
                 insert  into  zj_front_ihouse.zj_front_housesell (
                     `id`,`create_date`,`del_flag`,`remarks`,`update_date`,
                     `address`,`appstate`,`area_id`,`belong`,`borough_id`,
                     `borough_name`,`broker_id`,`check_name`,`check_time`,`consigner_id`,
                     `down_time`,`draw_url`,`house_age`,`house_desc`,`house_drawing`,
                     `house_feature`,`house_fitment`,`house_floor`,`house_hall`,`house_no`,
                     `house_price`,`house_room`,`house_thumb`,`house_title`,`house_toilet`,
                     `house_topfloor`,`house_totalarea`,`house_toward`,`house_type`,`house_veranda`,
                     `is_down`,`is_promote`,`is_synchro`,`is_whether`,`owner_name`,
                     `owner_notes`,`owner_phone`,`status`,`submit_name`,`submit_time`,
                     `synchro_time`,`video`,`whether_time`,`create_by`,`update_by`,
                     `area_name`,`is_new`
                 ) values  (
                     v_id,v_create_date,v_del_flag,v_remarks,v_update_date,
                     v_address,v_appstate,v_area_id,v_belong,v_borough_id,
                     v_borough_name,v_broker_id,v_check_name,v_check_time,v_consigner_id,
                     v_down_time,v_draw_url,v_house_age,v_house_desc,v_house_drawing,
                     v_house_feature,v_house_fitment,v_house_floor,v_house_hall,v_house_no,
                     v_house_price,v_house_room,v_house_thumb,v_house_title,v_house_toilet,
                     v_house_topfloor,v_house_totalarea,v_house_toward,v_house_type,v_house_veranda,
                     v_is_down,v_is_promote,v_is_synchro,v_is_whether,v_owner_name,
                     v_owner_notes,v_owner_phone,v_status,v_submit_name,v_submit_time,
                     v_synchro_time,v_video,v_whether_time,v_create_by,v_update_by,
                     v_area_name,v_is_new
                 );
                 if t_error = 1  then
                     set  v_cerror = v_cerror + t_error;
                     rollback ;
                     leave read_loop;
                 end  if;
             end  if;
         elseif v_log_flag =  'd'  then
             if v_count !=0  then
                 delete  from  zj_front_ihouse.zj_front_housesell  where  id = v_id;
                 if t_error = 1  then
                     set  v_cerror = v_cerror + t_error;
                     rollback ;
                     leave read_loop;
                 end  if;
             end  if;
         elseif v_log_flag =  'u'  then
             if v_count != 0  then
                 update  zj_front_ihouse.zj_front_housesell  set 
                 `id`=v_id,`create_date`=v_create_date,`del_flag`=v_del_flag,`remarks`=v_remarks,`update_date`=v_update_date,
                 `address`=v_address,`appstate`=v_appstate,`area_id`=v_area_id,`belong`=v_belong,`borough_id`=v_borough_id,
                 `borough_name`=v_borough_name,`broker_id`=v_broker_id,`check_name`=v_check_name,`check_time`=v_check_time,`consigner_id`=v_consigner_id,
                 `down_time`=v_down_time,`draw_url`=v_draw_url,`house_age`=v_house_age,`house_desc`=v_house_desc,`house_drawing`=v_house_drawing,
                 `house_feature`=v_house_feature,`house_fitment`=v_house_fitment,`house_floor`=v_house_floor,`house_hall`=v_house_hall,`house_no`=v_house_no,
                 `house_price`=v_house_price,`house_room`=v_house_room,`house_thumb`=v_house_thumb,`house_title`=v_house_title,`house_toilet`=v_house_toilet,
                 `house_topfloor`=v_house_topfloor,`house_totalarea`=v_house_totalarea,`house_toward`=v_house_toward,`house_type`=v_house_type,`house_veranda`=v_house_veranda,
                 `is_down`=v_is_down,`is_promote`=v_is_promote,`is_synchro`=v_is_synchro,`is_whether`=v_is_whether,`owner_name`=v_owner_name,
                 `owner_notes`=v_owner_notes,`owner_phone`=v_owner_phone,`status`=v_status,`submit_name`=v_submit_name,`submit_time`=v_submit_time,
                 `synchro_time`=v_synchro_time,`video`=v_video,`whether_time`=v_whether_time,`create_by`=v_create_by,`update_by`=v_update_by,
                 `area_name`=v_area_name,`is_new`=v_is_new
                 where  id = v_id;
                 if t_error = 1  then
                     set  v_cerror = v_cerror + t_error;
                     rollback ;
                     leave read_loop;
                 end  if;
             else
                 insert  into  zj_front_ihouse.zj_front_housesell (
                     `id`,`create_date`,`del_flag`,`remarks`,`update_date`,
                     `address`,`appstate`,`area_id`,`belong`,`borough_id`,
                     `borough_name`,`broker_id`,`check_name`,`check_time`,`consigner_id`,
                     `down_time`,`draw_url`,`house_age`,`house_desc`,`house_drawing`,
                     `house_feature`,`house_fitment`,`house_floor`,`house_hall`,`house_no`,
                     `house_price`,`house_room`,`house_thumb`,`house_title`,`house_toilet`,
                     `house_topfloor`,`house_totalarea`,`house_toward`,`house_type`,`house_veranda`,
                     `is_down`,`is_promote`,`is_synchro`,`is_whether`,`owner_name`,
                     `owner_notes`,`owner_phone`,`status`,`submit_name`,`submit_time`,
                     `synchro_time`,`video`,`whether_time`,`create_by`,`update_by`,
                     `area_name`,`is_new`
                 ) values  (
                     v_id,v_create_date,v_del_flag,v_remarks,v_update_date,
                     v_address,v_appstate,v_area_id,v_belong,v_borough_id,
                     v_borough_name,v_broker_id,v_check_name,v_check_time,v_consigner_id,
                     v_down_time,v_draw_url,v_house_age,v_house_desc,v_house_drawing,
                     v_house_feature,v_house_fitment,v_house_floor,v_house_hall,v_house_no,
                     v_house_price,v_house_room,v_house_thumb,v_house_title,v_house_toilet,
                     v_house_topfloor,v_house_totalarea,v_house_toward,v_house_type,v_house_veranda,
                     v_is_down,v_is_promote,v_is_synchro,v_is_whether,v_owner_name,
                     v_owner_notes,v_owner_phone,v_status,v_submit_name,v_submit_time,
                     v_synchro_time,v_video,v_whether_time,v_create_by,v_update_by,
                     v_area_name,v_is_new
                 );
                 if t_error = 1  then
                     set  v_cerror = v_cerror + t_error;
                     rollback ;
                     leave read_loop;
                 end  if;
             end  if;
         end  if;
     end  loop;
   -- 关闭游标
   close  cur;
     -- 清理swp表
     if v_cerror = 0  then
         delete  from  zj_front_ihouse.zj_front_housesell_swp 
             where  lot_NO = p_lot_NO  and  (log_flag =  'i'  or  log_flag =  'd'  or  log_flag =  'u' );
         if t_error = 1  then
             set  v_cerror = v_cerror + t_error;
             rollback ;
         end  if;
     end  if;
     -- 结束事务
     if v_cerror = 0  then
         commit ;
     else
         rollback ;
     end  if;
end








本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1698697,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
186 0
|
4月前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
714 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
2月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
2月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
4月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
152 43
|
3月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
3月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
101 2
|
3月前
|
存储 SQL NoSQL
|
3月前
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。

热门文章

最新文章