91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql的存儲過程、游標 、事務有什么用

發布時間:2020-12-03 10:18:07 來源:億速云 閱讀:147 作者:小新 欄目:MySQL數據庫

這篇文章給大家分享的是有關mysql的存儲過程、游標 、事務有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

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

下面是自己曾經編寫過的mysql數據庫存儲過程,留作存檔,以后用到的時候拿來參考。

其中,涉及到了存儲過程、游標(雙層循環)、事務。

【說明】:代碼中的注釋只針對當時業務而言,無須理會。

代碼如下:

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,只要發生異常就回滾*/
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
  
  /*聲明當游標遍歷完全部記錄后將標志變量置成某個值*/
  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET done=1;
  
  /*開啟事務*/
  START TRANSACTION;
  
  /*打開游標*/
  OPEN cur;
  
  /*使用LOOP循環遍歷*/
  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;
        
        /*發生異常,回滾*/
        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;
    
    /*控制外部的循環,該步驟不能缺少,否則只循環一次就結束了*/
    SET done=0;
    
  END LOOP out_loop;
  CLOSE cur;
  
  /*如果沒有發生過回滾事件,則更新task狀態*/
  /*如果回滾過,不更新task狀態,下次執行任務的時候,會再次將剩余沒有提交的數據進行添加到正式表*/
  IF isrollback=0 THEN
    UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
  END IF;
  
  END$$

DELIMITER ;

感謝各位的閱讀!關于mysql的存儲過程、游標 、事務有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澄迈县| 嵊泗县| 永定县| 宜宾市| 都兰县| 隆林| 沙雅县| 错那县| 兰州市| 炉霍县| 澎湖县| 衡东县| 木兰县| 隆子县| 项城市| 承德市| 德化县| 玉林市| 临夏县| 牙克石市| 红安县| 和田县| 霸州市| 高邮市| 平原县| 竹山县| 荣昌县| 三台县| 周口市| 武陟县| 枣庄市| 信丰县| 固阳县| 广宗县| 遵义市| 六枝特区| 舞钢市| 肃宁县| 始兴县| 香港| 汉中市|