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

原文地址:https://blog.51cto.com/luhaiyou/2363765

时间: 2024-10-03 07:25:01

mysql 存储过程demo的相关文章

mysql 存储过程 函数 触发器

mysql存储过程与函数 存储过程demo mysql> delimiter // -- 这里//为修改默认分隔符: mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; // -- 改回来这里的默

MySQL存储过程定时任务

一.基本概念 mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程. 二.适用范围 对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理.例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表. 三.使用权限 单独使用event调用SQL语句时,查看和

MySQL存储过程定义及调用

#MySQL存储过程 ##最简单的存储过程 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() COMMENT '最简单的存储过程' SELECT 1; ##调用 CALL sp1 (); ##带输入参数的存储过程 DROP PROCEDURE IF EXISTS sp2; CREATE PROCEDURE sp2(IN p INT) COMMENT '带输入参数的存储过程' SELECT p; ##调用 CALL sp2(1); #带输出参

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

MySQL 存储过程检测表是否存在

SQL语句实现: SELECT COUNT(*) FROM information_schema.`TABLES` WHERE TABLE_NAME='youTableName'; where子句中,表名是字符串类型,要加单引号. MySQL存储过程中 函数实现: CREATE DEFINER = `root`@`localhost` FUNCTION `tableExists`(`tName` varchar(30))  RETURNS tinyint(4) BEGIN DECLARE tab

mysql存储过程入门与提高(第三篇)

由于一些不好说的原因,以后博客内容大多只会发笔记的截图.此博客只发在my.oschina.net上,请勿作任何商业用途!! mysql存储过程:是指在数据库中定义一组sql语句组合在一起,并当作一个整体存储在mysql服务器中. 和存储函数的最主要的区别是对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象.函数只能返回一个变量:而存储过程可以返回多个.my.oschina.net讲存储函数的时候会把储存过程和存储函数的区别列出来.my.oschina.net 基本形式: CREA

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编