mysql 存储过程demo
admin
2023-04-18 16:23:41
0

从没写过mysql 存储过程,靠着百度和以前写oracle存储过程的经验写了一个,还算顺利,留个例子吧

CREATE DEFINER=`west_brain`@`%` PROCEDURE `man_tree_area`( )
BEGIN
  -- 存储树状结果处理sql变量
    DECLARE
        var_code VARCHAR ( 1000 );
    DECLARE
        var_pcode VARCHAR ( 1000 );
    DECLARE
        var_name VARCHAR ( 1000 );
    DECLARE
        var_count INT;

    -- 存储的一些标记变量    
    DECLARE
        buf_parents VARCHAR ( 1000 ) DEFAULT '';
    DECLARE
        buf_names VARCHAR ( 1000 ) DEFAULT '';
    DECLARE
        buf_code VARCHAR ( 100 ) DEFAULT '';
    DECLARE
        buf_update INT DEFAULT FALSE;
    DECLARE 
      buf_is_leaf INT DEFAULT 0;

    -- 树级别 根为1
    DECLARE 
      buf_tree_level int DEFAULT 0;
    -- 是否叶子节点 0 非 1是
    DECLARE 
      buf_tree_leaf int DEFAULT 1;

    -- 存储表循环游标的变量
    DECLARE
        vcode VARCHAR ( 64 );
    DECLARE
        vparent VARCHAR ( 1000 );

    -- 游标结束的处理变量
    DECLARE
        done INT DEFAULT FALSE;

    -- 定义表循环游标
    DECLARE
        mycursor CURSOR FOR ( SELECT CODE, parent FROM adm_sys_area_info );

    -- 定义游标溢出的处理操作
    DECLARE
        CONTINUE HANDLER FOR NOT FOUND 
        SET done = TRUE;

    -- 打开游标
    OPEN mycursor;

    -- 定义游标循环
    tableloop :
    LOOP
        -- 读取游标的一条数据到变量里
            FETCH mycursor INTO vcode,
            vparent;

        -- 如果上步游标操作没有读取到记录,则done 会被设置为 TRUE,退出 名称为myloop的循环
        IF
            done THEN
                LEAVE tableloop;
        END IF;

        -- 记录当前记录的区域编码
        SET buf_code = vcode; 

        -- 判断自己是否是叶子节点
        SELECT count(*) into var_count from adm_sys_area_info where parent  = vcode;

        if var_count = 0 then
          update adm_sys_area_info set tree_leaf = 1 where code = vcode;
        else
          update adm_sys_area_info set tree_leaf = 0 where code = vcode;
        end if;

        set var_count = 0;

    -- 循环查找自己的父节点
        treeloop :
        LOOP

          -- 判断自己是否存在父节点,用count来判断
            SELECT
                count( * ) INTO var_count 
            FROM
                adm_sys_area_info 
            WHERE
                CODE = vparent;

            IF
                var_count = 0 THEN
                -- 没有上级节点了,则开始处理以前找到的父节点
                IF
                    buf_update THEN-- 更新缓存的数据
                    -- buf_update 为TRUE 则说明找到过父节点

                    -- 下面两个记录处理拼接的字符串末尾多的逗号的问题
                    IF
                        ( length( buf_parents ) > 0 ) THEN

                            SET buf_parents = LEFT ( buf_parents, CHAR_LENGTH( buf_parents ) - 1 );
                    END IF;
                    IF
                        ( length( buf_names ) > 0 ) THEN

                            SET buf_names = LEFT ( buf_names, CHAR_LENGTH( buf_names ) - 1 );
                    END IF;

                    -- 更新当前节点的父信息
                    UPDATE adm_sys_area_info 
                    SET parents = buf_parents,
                    tree_names = buf_names ,tree_level = buf_tree_level 
                    WHERE
                        CODE = buf_code;

                ELSE
                  -- 当前记录是根节点
                    update adm_sys_area_info set tree_level = 1 where code = buf_code;
                END IF;

                -- 清理变量
                SET buf_parents = '';
                SET buf_names = '';
                SET vparent = '';
                SET buf_code = '';
                SET buf_update = FALSE;
                SET buf_tree_level = 1;

                -- 结束当前记录的处理循环
                LEAVE treeloop;

                ELSE 
                  -- 查找到了父节点
                    SET buf_update = TRUE;
                    -- 查询当前节点的父节点信息
                    SELECT CODE,
                        parent,
                        area_name INTO var_code,
                        var_pcode,
                        var_name 
                    FROM
                        adm_sys_area_info 
                    WHERE
                        CODE = vparent;

                    -- 连接字符串
                    SET buf_parents = CONCAT_WS( ',', var_code, buf_parents );
                    SET buf_names = CONCAT_WS( ',', var_name, buf_names );
                    -- 记录当前查找到记录的父节点code
                    SET vparent = var_pcode;
                    SET buf_tree_level = buf_tree_level + 1;

            END IF;

        END LOOP;

    END LOOP;
    CLOSE mycursor;

END

相关内容

热门资讯

“一次愉快的会晤”,泽连斯基披... 在俄乌互相加大对对方纵深目标打击之际,乌克兰总统泽连斯基7月28日造访了白宫,与美国总统特朗普举行会...
总统连遭“逼宫”,少帅临危受命 躲避着燃烧瓶和火箭弹袭击,四辆苏制BMP步兵战车快速穿行在马里乌波尔市区。即将出城的路口,迎面出现1...
独居女子在卧室玩偶内发现摄像头... 租房独居女子意外发现家中玩偶内藏着偷拍设备,报警后偷拍设备竟“不翼而飞”,门锁记录显示有人在她出门的...
伊学者:乌克兰袭击行动适得其反... 乌克兰袭击与伊朗有关的船只后,伊朗和俄罗斯接连作出强硬回应。伊朗外交学院教授法拉吉扎德在接受凤凰卫视...
20万人怒火不会停!蓝议员挺蒋... 海峡导报综合报道 在蓝白号召台湾民众上凯道呐喊“反毒台”后,台北市长蒋万安日前透露,近日不少民代私下...
柯文哲妻子陈佩琪畅游大陆,民进... 台湾民众党前主席柯文哲妻子陈佩琪27日在脸书发文证实,自己早前由儿子陪同前往上海、杭州与北京旅游一周...
高市早苗被问如何改善中日关系 据日本东京新闻报道,当地时间7月27日,日本首相高市早苗在首相官邸举行记者会。当被问及如何改善中日关...
扎哈罗娃批小泉进次郎涉核言论:... 【环球网报道 记者 张江平】综合俄新社等媒体报道,对于日本防卫大臣小泉进次郎涉核言论,俄罗斯外交部发...
“特高课”再现?日本强推“国家... 无视反对战争正义呼声 复刻战前军国主义体制日本强推“国家情报局”引发广泛担忧和批评(国际视点)本报记...
6G相比5G不只是速度更快 将...   6G相比5G不只是速度更快  【6G相比5G不只是速度更快】7月28日,相比5G,6G不仅是速度...