MySQL存储过程 游标 错误处理的示例代码


本文摘自PHP中文网,作者黄舟,侵删。

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

--set_account_data 重新生成用户编号

 

BEGIN

  DECLARE temp_id INT(8);                                        /*用户id*/

  DECLARE temp_manager INT(8);                            /*上级id*/

  DECLARE temp_accounter_no VARCHAR(64);        /*上级编码*/

    DECLARE temp_max_no VARCHAR(64);                    /*上级的最大下级编码*/

    DECLARE max_no VARCHAR(64);                                /*编码*/

    DECLARE str1 VARCHAR(64);                                    /*编码*/

    DECLARE temp_no INT(8);                                        /*编码*/

    DECLARE temp_level INT(8);                                /*级次*/

    DECLARE state VARCHAR(30);                                /*错误处理监听变量*/

 

    /*定义用户表游标*/

    DECLARE account_cursor CURSOR FOR SELECT id,manager FROM account ORDER BY manager,id;

 

    /*定义错误处理监听,用于结束游标循环*/

    DECLARE CONTINUE HANDLER FOR 1329

    BEGIN

        SET state = 'error';

    END;

 

  OPEN account_cursor;

  REPEAT

        FETCH account_cursor INTO temp_id,temp_manager;

        IF (temp_id = 1) THEN

            UPDATE account SET leaf = 0,no = '01',level = 1 WHERE id = 1;

        ELSE

            /*设置上级leaf为0*/

            UPDATE account SET leaf = 0 WHERE id = temp_manager;

            /*查询上级编号*/

            SELECT no INTO temp_accounter_no FROM account WHERE id = temp_manager;

            /*设置上级编码*/

            UPDATE account SET pno = temp_accounter_no WHERE id = temp_id;

            /*查询上级原有的最大下级编码*/

            SELECT MAX(no) INTO temp_max_no FROM account WHERE pno = temp_accounter_no;

            /*如果最大下级编码为空,生成新的编码,否则把原来的编码加一*/

            IF (temp_max_no IS NULL) THEN

                SET max_no = concat(temp_accounter_no, '0001');

            ELSE

                SET str1 = SUBSTR(temp_max_no,LENGTH(temp_max_no)-3,4);

                SET temp_no = str1;

                SET temp_no = temp_no + 1;

                SET str1 = temp_no;

                IF (LENGTH(str1) = 1) THEN

                    SET str1 = concat('000', str1);

                ELSEIF (LENGTH(str1) = 2) THEN

                    SET str1 = concat('00', str1);

                ELSEIF (LENGTH(str1) = 3) THEN

                    SET str1 = concat('0', str1);           

                END IF;

                SET max_no = concat(temp_accounter_no, str1);

            END IF;

            UPDATE account SET no = max_no WHERE id = temp_id;

            SET temp_level = (LENGTH(max_no) + 2) / 4;

            UPDATE account SET level = temp_level WHERE id = temp_id;

        END IF;

        UNTIL state = 'error'

    END REPEAT;

    CLOSE account_cursor;

    /*修改leaf为null的为1*/

    UPDATE account SET leaf = 1 WHERE leaf IS NULL;

    RETURN 0;

END

以上就是MySQL存储过程 游标 错误处理的示例代码的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

mysql深入浅出掌握触发器用法

数据库完整性包括哪三种

sql server无法连接服务器怎么办?

示例mysql事务隔离级别以及脏读、幻读、不可重复读

centos7 mysql数据库安装及配置实现教程

mysql 和 sql server 的区别?

windows下mysql-5.7.22-winx64突然启动不了,报错could not open log file

正版数据库管理工具 navicat for mysql 中文版软件安装、破解步骤

详解mysql数据库中有关source命令

mysql如何查询当前用户下的所有表名

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


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

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

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

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

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

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

评论

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