`
weijiewell
  • 浏览: 10066 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实例详解MySql数据库存储过程

阅读更多
提示:本文是利用业余时间写的,SQL代码是我直接敲的,没有实际执行过,我将会进行修改。谢谢各位。本人也是初学mysql存储过程,把自己在学习过程中遇到的问题总结下来,希望对各位同学提供帮助。

1、MySql存储过程创建
通过以下简单的例子,来简单学习并创建一个简单的存储过程,从执行结果中可以得到table_name的最大id。
DROP PROCEDURE IF EXISTS proc_name;  
DELIMITER //
CREATE PROCEDURE proc_name()   -- 创建存储过程 参数([in|out|inout] 参数 datatype) 本例子不涉及in 和 out 参数
BEGIN

  DECLARE maxId int(10) DEFAULT 0; -- 声明变量   maxId

  SELECT MAX(id) INTO maxId FROM table_name;  -- 从表中查询最大的id 放到变量maxId中
  
  SELECT maxId; -- 输入maxId的值
END //
DELIMITER ;
 


2、游标的使用
我们从t_user表中查询status为CANCEL的,删除所有t_user_history对应的数据
DROP PROCEDURE IF EXISTS proc_del_userhistory;  
DELIMITER //
CREATE PROCEDURE proc_del_userhistory()   -- 创建存储过程数
BEGIN

  DECLARE userId int(10) DEFAULT 0; -- 声明变量   userId
  DECLARE userStatus char(10) DEFAULT ''; -- 声明变量 userStatus
  DECLARE deleteStatus char(10) DEFAULT 'CANCEL'; -- 声明要删除状态的值
  DECLARE stopFlag int(1) DEFAULT 0; -- 循环停止标志,可以不声明
  DECLARE user_cursor CURSOR FOR SELECT id,status FROM t_user;  -- 声明游标user_cursor
  
  SET deleteStatus = 'CANCEL'; -- 如果default没设值,这里也可以设置哦。

  OPEN user_cursor; -- 打开游标
  REPEAT  -- 这里采用REPEAT循环游标
  FETCH user_cursor INTO userId,userStatus ; -- fetch取值 把当前的值放到userId中
  
    IF stopFlag <> 1 THEN  -- 判断是否还有数据 防止多循环一次
      -- 这里为了学习,把状态的判断放到IF 语句中,同学们自己写代码时,一定要放到where 语句中哦。。
      IF userStatus = deleteStatus THEN
        DELETE FROM t_user_history WHERE user_id = userId;
      END IF;
    END IF;

  UNTIL stopFlag=1 END REPEAT;   -- 循环结束条件
  CLOSE user_cursor;  -- 关闭光标
 
END //
DELIMITER ;
 


我想经过这个例子,大家一般的存储过程都可以写了。接下来,我分享一下自己在存储过程中遇到的比较难以解决的问题


3、游标循环次数多一次
主要是循环的时候,条件判断的问题,可参考上面例子的处理方式(IF stopFlag <> 1 THEN  -- 判断是否还有数据 防止多循环一次)
4、游标循环次数比预期少(针对次数少的情况)
这种情况出现一般出现的循环光标中,存在SELECT操作,由于概念不清导致的。参考http://hi.baidu.com/kankin/blog/item/1e0eac036338cff109fa93d0.html
部分代码:

    declare flag boolean;
  
    declare continue handler for NOT FOUND set flag = false; -- 每次fetch操作,mysql都判断根据 NOT FOUND 异常,如果发送则设置为flag = false

    set flag = true;

    open cur;

    fetch cur into userId;

    while flag do

        select id into accountId from t_user_account where id = userId;  -- 这里如果没有取到数据,亦会报NOT FOUND 异常把 flag 设为false,导致循环提前退出

        if accountId is not null then
        
            do coding....    

        end if;  
    fetch cur into userId;

    select fetchOk;

    end while;



解决方法,再循环体内部,保留flag值
    declare flag boolean;
    declare falg_temp boolean;
    declare continue handler for NOT FOUND set flag = false; -- 每次fetch操作,mysql都判断根据 NOT FOUND 异常,如果发送则设置为flag = false

    set flag = true;

    open cur;

    fetch cur into userId;

    while flag do
        set flag_temp = flag;  -- 设置flag_temp 为当前flag值
        select id into accountId from t_user_account where id = userId;  -- 这里如果没有取到数据,亦会报NOT FOUND 异常把 flag 设为false,导致循环提前退出

        if accountId is not null then
        
            do coding....    

        end if;  
    set flag = flag_temp;   -- 还原flag值
    fetch cur into userId;

    select fetchOk;

    end while;
分享到:
评论

相关推荐

    mysql存储过程之case语句用法实例详解

    本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下: 除了if语句,mysql提供了一个替代的条件语句CASE。 mysql的 CASE语句使代码更加可读和高效。废话不多说,我们先来看下简单case语句的...

    mysql存储过程实例详解,pdf

    mysql存储过程实例详解

    mysql存储过程之错误处理实例详解

    本文实例讲述了mysql存储过程之错误处理。分享给大家供大家参考,具体如下: 当存储过程中发生错误时,重要的是适当处理它,例如:继续或退出当前代码块的执行,并发出有意义的错误消息。其中mysql提供了一种简单的...

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

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。 其中,涉及到了存储过程、游标(双层循环)、事务。 【说明】:代码中的注释只针对当时业务而言,无须理会。 代码如下: ...

    mysql存储过程原理与使用方法详解

    本文实例讲述了mysql存储过程原理与使用方法。分享给大家供大家参考,具体如下: 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 存储过程的优点 #1. 用于...

    mysql数据存储过程参数实例详解

    主要介绍了mysql数据存储过程参数实例详解,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。

    详解MySQL数据库之触发器

    MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE。如果定义了触发器,当数据库执行这些语句的时候就会激活触发器执行相应的操作,触发...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    28-MySQL数据库多实例启动问题排错方法及实战排错.avi 29-MySQL数据库多实例实战排错02.avi 30-增加MySQL数据库第三个实例实战讲解.avi 31-MySQL数据库多实例的其他故障问题说明.avi 第三部:MySQL应用管理及进阶...

    Python3爬虫学习之MySQL数据库存储爬取的信息详解

    本文实例讲述了Python3爬虫学习之MySQL数据库存储爬取的信息。分享给大家供大家参考,具体如下: 数据库存储爬取的信息(MySQL) 爬取到的数据为了更好地进行分析利用,而之前将爬取得数据存放在txt文件中后期处理...

    MySql零基础入门到精通(资料集)SQL语句+触发器+存储过程+安装卸载+导入导出+性能优化

    学习路线已为你标好,初学者不必走弯路浪费时间,一步到位实践精通 第一阶段---MySql入门教程,pdf ...第二阶段---如何导入导出MySQL数据库.doc 第二阶段---正确版MySgl绿色版配置及使用详解.doc ..............

    MYSQL数据库表结构优化方法详解

    本文实例讲述了MYSQL数据库表结构优化方法。分享给大家供大家参考,具体如下:  选择合适的数据类型  1、使用可以存下你的数据的最小的数据类型  2、使用简单的数据类型。Int要比varchar类型在mysql处理上简单 ...

    MySQL数据库优化之分表分库操作实例详解

    本文实例讲述了MySQL数据库优化之分表分库操作。分享给大家供大家参考,具体如下: 分表分库 垂直拆分 垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程...

    mysql存储过程之if语句用法实例详解

    本文实例讲述了mysql存储过程之if语句用法。分享给大家供大家参考,具体如下: mysql中的 IF语句允许我们根据表达式的某个条件或值结果来执行一组SQL语句,所以我们要在MySQL中形成一个表达式,可以结合文字,变量,...

    MySQL存储过程概念、原理与常见用法详解

    本文实例讲述了MySQL存储过程概念、原理与常见用法。分享给大家供大家参考,具体如下: 1、存储过程的概念 在一些语言中,如pascal,有一个概念叫“过程”procedure,和“函数”function,在php中,没有过程,只有...

    MySQL自定义函数和存储过程示例详解

    MySQL数据库中存在表user_info,其结构和数据如下: mysql&gt; desc user_info; +-----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+----------...

    MySQL操作之JSON数据类型操作详解

    上一篇文章我们介绍了mysql数据存储过程参数实例详解,今天我们看看MySQL操作之JSON数据类型的相关内容。 概述 mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql...

    MySQL加密和解密实例详解

    MySQL加密和解密实例详解 数据加密、解密在安全领域非常重要。对程序员而言,在数据库中以密文方式存储用户密码对入侵者剽窃用户隐私意义重大。 有多种前端加密算法可用于数据加密、解密,下面我向您推荐一种简单的...

    mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法。分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每行。mysql的...

    mysql中的sql_mode模式实例详解

    mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode: mysql&gt; select @@sql_mode; +-----------------------------------------...

    mysql中workbench实例详解

    MySQL workbench具有允许开发人员和数据库管理员可视化地创建物理数据库设计模型的工具,这些模型可以使用正向工程轻松转换为MySQL数据库。 2.MySQL Workbench 支持在同一环境中创建多个模型。 3.它支持构成数据库的...

Global site tag (gtag.js) - Google Analytics