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

简介:

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

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,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
关系型数据库 MySQL 分布式数据库
安全可靠的PolarDB V2.0 (兼容MySQL)产品能力及应用场景
PolarDB分布式轻量版采用软件输出方式,能够部署在您的自主环境中。PolarDB分布式轻量版保留并承载了云原生数据库PolarDB分布式版技术团队深厚的内核优化成果,在保持高性能的同时,显著降低成本。
920 141
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
11月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
11月前
|
SQL 监控 关系型数据库
MySQL事务处理:ACID特性与实战应用
本文深入解析了MySQL事务处理机制及ACID特性,通过银行转账、批量操作等实际案例展示了事务的应用技巧,并提供了性能优化方案。内容涵盖事务操作、一致性保障、并发控制、持久性机制、分布式事务及最佳实践,助力开发者构建高可靠数据库系统。
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
12月前
|
存储 关系型数据库 MySQL
MYSQL数据加密压缩函数应用实战指南。
总的来说,加密和压缩是维护MySQL数据库中数据安全性和效率的有效手段。使用时需权衡性能与安全,合理应用加密和压缩函数。在设计数据库架构时要考虑到加密字段的查询性能,因为加密可能使得一些索引失效。压缩数据能有效减少存储空间的占用,但在服务器负载较高时应避免实时压缩和解压,以免影响总体性能。
365 10
|
10月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
503 0
|
11月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
349 0
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
353 1

推荐镜像

更多