mysql的存儲過程、游標 、事務實例詳解
下面是自己曾經編寫過的mysql數據庫存儲過程,留作存檔,以后用到的時候拿來參考。
其中,涉及到了存儲過程、游標(雙層循環(huán))、事務。
【說明】:代碼中的注釋只針對當時業(yè)務而言,無須理會。
代碼如下:
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
|
DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData( IN jobId VARCHAR (24)) BEGIN DECLARE idval VARCHAR (24) DEFAULT '' ; DECLARE taskIdval VARCHAR (24) DEFAULT '' ; DECLARE groupIdval VARCHAR (24) DEFAULT '' ; DECLARE emailval VARCHAR (50) DEFAULT '' ; /*標識正式表是否存在一條相同數據,即:groupId、email相同*/ DECLARE infoId VARCHAR (24) DEFAULT '' ; /*標識事務錯誤*/ DECLARE err INT DEFAULT 0; /*達到一定數量就進行提交,計數器*/ DECLARE counts INT DEFAULT 0; /*標識是否回滾過*/ DECLARE isrollback INT DEFAULT 0; /*游標遍歷時,作為判斷是否遍歷完全部記錄的標記*/ DECLARE done INTEGER DEFAULT 0; /*獲取臨時表該任務的數據*/ DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId; /*根據群組id、email查詢是否存在相同記錄*/ DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval; /* 出現錯誤,設置為1,只要發(fā)生異常就回滾*/ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1; /*聲明當游標遍歷完全部記錄后將標志變量置成某個值*/ DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; /*開啟事務*/ START TRANSACTION ; /*打開游標*/ OPEN cur; /*使用LOOP循環(huán)遍歷*/ out_loop:LOOP /*將每一條結果對應的字段值賦值給變量*/ FETCH cur INTO idval,taskIdval,groupIdval,emailval; IF done = 1 THEN LEAVE out_loop; END IF; /*打開第二個游標*/ OPEN cur2; SET done = 0; FETCH cur2 INTO infoId; /*如果正式表不存在相同groupId and email記錄,添加到正式表*/ IF done = 1 THEN /*插入正式表*/ INSERT INTO `t_email_info` VALUES (idval,emailval,groupIdval,0, '' ,NOW(), 'admin' ,NOW(), 'admin' ); /*刪除臨時數據*/ DELETE FROM `t_email_data_temp` WHERE id = idval; /*計數器,每1000條才提交*/ SET counts = counts + 1; /*發(fā)生異常,回滾*/ IF err=1 THEN SET isrollback=1; ROLLBACK ; ELSE IF counts = 1000 THEN COMMIT ; /*達到1000條提交后,重置計數器*/ SET counts=0; END IF; END IF; ELSE /*已經存在相同記錄,則刪除該記錄*/ IF done=0 THEN DELETE FROM `t_email_data_temp` WHERE id = idval; END IF; END IF; FETCH cur2 INTO infoId; CLOSE cur2; /*控制外部的循環(huán),該步驟不能缺少,否則只循環(huán)一次就結束了*/ SET done=0; END LOOP out_loop; CLOSE cur; /*如果沒有發(fā)生過回滾事件,則更新task狀態(tài)*/ /*如果回滾過,不更新task狀態(tài),下次執(zhí)行任務的時候,會再次將剩余沒有提交的數據進行添加到正式表*/ IF isrollback=0 THEN UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId; END IF; END $$ DELIMITER ; |
以上就是mysql的存儲過程、游標 、事務的講解,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.cnblogs.com/zhoubang521/p/5200317.html