详细讲解mysql的存储过程、游标 、事务


本文摘自PHP中文网,作者小云云,侵删。

本文主要介绍了mysql的存储过程、游标 、事务实例详解的相关资料,这里举实例说明MySQL 存储过程与游标和事务,需要的朋友可以参考下,希望能帮助到大家。

相关mysql视频教程推荐:《mysql教程》

mysql的存储过程、游标 、事务实例详解

下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。

其中,涉及到了存储过程、游标(双层循环)、事务。

【说明】:代码中的注释只针对当时业务而言,无须理会。

代码如下:

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,只要发生异常就回滚*/

  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的存储过程、游标 、事务的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

mysql如何给表中添加列(字段)?

mysql运行sql文件时出现问题怎么办

mysql常用函数大全

mysql对数据的更新操作记录在哪个日志中?

mysql基础之连接mysql、修改密码、添加用户

mysql压缩包版怎么安装?

史上最全mysql使用规范分享

mysql中的权限详解

mysql高级学习之索引的优劣势及规则使用

安装mysql后没有看到服务怎么办?

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...