mysqlのストレージ・プロシージャ、カーソル、トランザクション・インスタンスの詳細

3464 ワード

mysqlのストレージ・プロシージャ、カーソル、トランザクション・インスタンスの詳細
以下は自分が作成したmysqlデータベースのストレージプロセスで、アーカイブとして残しておき、後で使うときに参考にします.
ストレージ・プロシージャ、カーソル(2階層ループ)、トランザクションに関連します.
【説明】:コードのコメントは、当時のビジネスにのみ適用され、無視する必要はありません.
コードは次のとおりです.

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のストレージプロセス、カーソル、事務の説明です.質問があれば、伝言を残したり、当駅のコミュニティで討論したりしてください.読書に感謝しています.皆さんを助けてほしいです.当駅のサポートに感謝します.