激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - mysql的存儲過程、游標 、事務實例詳解

mysql的存儲過程、游標 、事務實例詳解

2020-08-05 16:41zhoubang521 Mysql

這篇文章主要介紹了mysql的存儲過程、游標 、事務實例詳解的相關資料,這里舉實例說明MySQL 存儲過程與游標和事務,需要的朋友可以參考下

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 深夜影院一级毛片 | av7777777| 毛片视频免费观看 | 欧美成人理论片乱 | 国产三级国产精品国产普男人 | 一级毛片免费在线 | 黄在线免费 | 成人黄色在线电影 | 国产精品99一区二区 | 日本黄色a视频 | 日韩av片网站 | 国产精品区一区二区三区 | 欧美日本国产精品 | 毛片免费在线观看视频 | 91精品国产99久久久久久 | 91成人在线免费视频 | 久久综合久久综合久久 | 精品国产一区二区三区四区在线 | 久久综合网址 | 老女人碰碰在线碰碰视频 | 国产毛片毛片 | 一二区电影 | 精品国产九九九 | 国产超碰人人做人人爱ⅴa 色天天综合网 | 成人精品 | 黄色毛片a级 | 91在线视频福利 | 黄色影院av | 免费一级毛片在线播放视频 | 成年人观看免费视频 | 欧美日韩亚洲另类 | 欧美大片一级毛片 | 奇米影视888狠狠狠777不卡 | 国产精品色综合 | 91嫩草丨国产丨精品入口 | 亚洲91网| 国产无限资源在线观看 | 中文字幕网在线 | 欧美五月婷婷 | 精品一区在线视频 | 97久久精品一区二区三区观看 |