千家信息网

mysql 存储过程demo

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,从没写过mysql 存储过程,靠着百度和以前写oracle存储过程的经验写了一个,还算顺利,留个例子吧CREATE DEFINER=`west_brain`@`%` PROCEDURE `man_tr
千家信息网最后更新 2025年01月20日mysql 存储过程demo

从没写过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
0