<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      詳細講解mysql的存儲過程、游標 、事務

      [摘要]本文主要介紹了mysql的存儲過程、游標 、事務實例詳解的相關資料,這里舉實例說明MySQL 存儲過程與游標和事務,需要的朋友可以參考下,希望能幫助到大家。mysql的存儲過程、游標 、事務實例詳解...
      本文主要介紹了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存儲過程和事務的簡單介紹

      存儲過程的定義、修改和刪除的操作方法

      MySQL存儲過程 游標 錯誤處理的示例代碼

      以上就是詳細講解mysql的存儲過程、游標 、事務的詳細內容,更多請關注php中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清