欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解

 更新時(shí)間:2017年08月02日 11:48:36   投稿:lqh  
這篇文章主要介紹了mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解的相關(guān)資料,這里舉實(shí)例說(shuō)明MySQL 存儲(chǔ)過(guò)程與游標(biāo)和事務(wù),需要的朋友可以參考下

mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解

下面是自己曾經(jīng)編寫(xiě)過(guò)的mysql數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程,留作存檔,以后用到的時(shí)候拿來(lái)參考。

其中,涉及到了存儲(chǔ)過(guò)程、游標(biāo)(雙層循環(huán))、事務(wù)。

【說(shuō)明】:代碼中的注釋只針對(duì)當(dāng)時(shí)業(yè)務(wù)而言,無(wú)須理會(huì)。

代碼如下:

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 '';
  
  /*標(biāo)識(shí)正式表是否存在一條相同數(shù)據(jù),即:groupId、email相同*/
  DECLARE infoId VARCHAR(24) DEFAULT '';
  
  /*標(biāo)識(shí)事務(wù)錯(cuò)誤*/
  DECLARE err INT DEFAULT 0;
  
  /*達(dá)到一定數(shù)量就進(jìn)行提交,計(jì)數(shù)器*/
  DECLARE counts INT DEFAULT 0;
  
  /*標(biāo)識(shí)是否回滾過(guò)*/
  DECLARE isrollback INT DEFAULT 0;
  
  /*游標(biāo)遍歷時(shí),作為判斷是否遍歷完全部記錄的標(biāo)記*/
  DECLARE done INTEGER DEFAULT 0;
  
  /*獲取臨時(shí)表該任務(wù)的數(shù)據(jù)*/
  DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId;
  
  /*根據(jù)群組id、email查詢(xún)是否存在相同記錄*/
  DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval; 
  
  /* 出現(xiàn)錯(cuò)誤,設(shè)置為1,只要發(fā)生異常就回滾*/
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
  
  /*聲明當(dāng)游標(biāo)遍歷完全部記錄后將標(biāo)志變量置成某個(gè)值*/
  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET done=1;
  
  /*開(kāi)啟事務(wù)*/
  START TRANSACTION;
  
  /*打開(kāi)游標(biāo)*/
  OPEN cur;
  
  /*使用LOOP循環(huán)遍歷*/
  out_loop:LOOP
  
    /*將每一條結(jié)果對(duì)應(yīng)的字段值賦值給變量*/
    FETCH cur INTO idval,taskIdval,groupIdval,emailval;
    IF done = 1 THEN
      LEAVE out_loop;
    END IF;
    
    /*打開(kāi)第二個(gè)游標(biāo)*/
    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');
        
        /*刪除臨時(shí)數(shù)據(jù)*/
        DELETE FROM `t_email_data_temp` WHERE id = idval;
        
        /*計(jì)數(shù)器,每1000條才提交*/
        SET counts = counts + 1;
        
        /*發(fā)生異常,回滾*/
        IF err=1 THEN
          SET isrollback=1;
          ROLLBACK;
        ELSE
          IF counts = 1000 THEN
            COMMIT;
            /*達(dá)到1000條提交后,重置計(jì)數(shù)器*/
            SET counts=0;
          END IF;
        END IF;
      ELSE
        /*已經(jīng)存在相同記錄,則刪除該記錄*/
        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)一次就結(jié)束了*/
    SET done=0;
    
  END LOOP out_loop;
  CLOSE cur;
  
  /*如果沒(méi)有發(fā)生過(guò)回滾事件,則更新task狀態(tài)*/
  /*如果回滾過(guò),不更新task狀態(tài),下次執(zhí)行任務(wù)的時(shí)候,會(huì)再次將剩余沒(méi)有提交的數(shù)據(jù)進(jìn)行添加到正式表*/
  IF isrollback=0 THEN
    UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
  END IF;
  
  END$$

DELIMITER ;

以上就是mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)的講解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • mysql limit 分頁(yè)的用法及注意要點(diǎn)

    mysql limit 分頁(yè)的用法及注意要點(diǎn)

    limit在mysql語(yǔ)句中使用的頻率非常高,一般分頁(yè)查詢(xún)都會(huì)使用到limit語(yǔ)句,本文章向碼農(nóng)們介紹mysql limit 分頁(yè)的用法與注意事項(xiàng),需要的朋友可以參考下
    2016-12-12
  • MySQL中SELECT+UPDATE處理并發(fā)更新問(wèn)題解決方案分享

    MySQL中SELECT+UPDATE處理并發(fā)更新問(wèn)題解決方案分享

    這篇文章主要介紹了MySQL中SELECT+UPDATE處理并發(fā)更新問(wèn)題解決方案分享,需要的朋友可以參考下
    2014-05-05
  • MySQL的增刪查改語(yǔ)句用法示例總結(jié)

    MySQL的增刪查改語(yǔ)句用法示例總結(jié)

    這篇文章主要介紹了MySQL的增刪查改語(yǔ)句用法示例總結(jié),是對(duì)MySQL學(xué)習(xí)的基本知識(shí)點(diǎn)的一個(gè)歸納,需要的朋友可以參考下
    2015-05-05
  • MySQL實(shí)時(shí)監(jiān)控工具orztop的使用介紹

    MySQL實(shí)時(shí)監(jiān)控工具orztop的使用介紹

    這篇文章主要給大家介紹了MySQL實(shí)時(shí)監(jiān)控工具orztop的使用,文中給出了詳細(xì)的介紹,相信對(duì)大家的學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • MySQL5.6.22安裝配置方法圖文教程

    MySQL5.6.22安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL5.6.22安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SQL中的開(kāi)窗函數(shù)(窗口函數(shù))

    SQL中的開(kāi)窗函數(shù)(窗口函數(shù))

    這篇文章主要介紹了SQL中的開(kāi)窗函數(shù)(窗口函數(shù))使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說(shuō)明

    MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說(shuō)明

    今天看到了MySQL的日期函數(shù),里面很多有用的,這里只把兩個(gè)參數(shù)不太好記的粘下來(lái)了。
    2010-06-06
  • 最新評(píng)論