MySql存储过程和游标的使用实例

目录
  • 前言
  • 1.创建存储过程。
  • 2.查看存储过程名称
  • 3.调用存储过程
  • 4.删除存储过程
  • 总结

前言

这里存储过程和游标的定义和作用就不介绍了,网上挺多的,只通过简单的介绍,然后用个案例让大家快速了解。实例中会具体说明变量的定义,赋值,游标的使用,控制语句,循环语句的介绍。

1.创建存储过程。

CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END

存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

  • IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT:该值可在存储过程内部被改变,并可返回
  • INOUT:调用时指定,并且可被改变和返回

2.查看存储过程名称

SELECT routine_name FROM information_schema.routines WHERE routine_schema='数据库名称';

3.调用存储过程

CALL myproc()

4.删除存储过程

DROP PROCEDURE IF EXISTS myproc;

因为mysql中游标只能在存储过程和方法中使用,所以就直接通过案例介绍游标。

案例:该案例采用无参存储过程,有参的也挺简单,根据上面的介绍,对应实现就行,该存储过程主要就创建一个存储过程,用它做查询 修改等操作。

#检查该存储过程是否存在 存在就删除了再创建
DROP PROCEDURE IF EXISTS processnames ;
#创建存储过程
CREATE PROCEDURE processnames()
#BEGIN END  存储过程中的sql逻辑写在BEGIN 和END 中
BEGIN
#定义变量
DECLARE var_name VARCHAR(300);
DECLARE var_uuid VARCHAR(300);
DECLARE count int DEFAULT 0 ;
DECLARE i int DEFAULT 0 ;
DECLARE done INT;
#定义游标
DECLARE nameCursor CURSOR FOR SELECT ParentId FROM datadictionary GROUP BY ParentId;
#该sql语句作用是  在你遍历游标的时候  游标循环结束 就会执行这句话,并给done赋值为1 然后循环就会停止 但该语句不适用WHILE 循环语句。
DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;
#查询一个表分组的总数量  并赋值给count变量
SELECT count(*) into count FROM (SELECT ParentId FROM datadictionary GROUP BY ParentId) t1;
#打开游标
OPEN nameCursor;
#循环体
    WHILE i<count DO
    #拿到游标指向的当前行的数据  并赋值给var_name变量
    FETCH nameCursor INTO var_name;
    #通过var_name变量进行相应的数据查询 把查询出来的数据通过into赋值给变量var_uuid
    SELECT uuid into var_uuid FROM datadictionary WHERE ID=var_name;
    #进行修改操作
    UPDATE datadictionary SET ParentId=var_uuid WHERE ParentId=var_name;
    #可以通过set 给变量赋值  这里用来记录循环体执行了多少次  看和游标遍历的条数是否一致
  SET i=i+1;
    #当i>count的时候循环体结束
  END WHILE;
    #关闭游标
    CLOSE nameCursor;
    #打印i
    SELECT i;
    #查看修改后的数据
    SELECT * FROM datadictionary;
    #存储过程结束标志
END;
#调用存储过程
CALL processnames()

案例2 添加操作,并且获取游标中的多列值

DROP PROCEDURE if EXISTS proce;
CREATE PROCEDURE proce()
BEGIN
 DECLARE  userid VARCHAR(50);
 DECLARE  depatementid VARCHAR(50);
 DECLARE  done INT;
 DECLARE nameCuursor CURSOR FOR SELECT id,FrameworkDepartmentId FROM frameworkusers ;
 DECLARE  continue handler FOR SQLSTATE '02000' SET done = 1;
 OPEN nameCuursor;
label: LOOP
  FETCH nameCuursor INTO userid,depatementid;
    IF done = 1 THEN
        LEAVE label;
    END IF;
    INSERT into frameworkdepartmentuser(ID,FrameworkUserId,FrameworkDepartmentId) VALUES(UUID(),userid,depatementid);
END LOOP label;
CLOSE nameCuursor;
END;
CALL proce();
SELECT * FROM frameworkdepartmentuser

注意:

1.DECLARE关键字 在存储过程内部就是定义变量的。

2.DECLARE nameCursor CURSOR FOR SELECT ParentId FROM datadictionary GROUP BY ParentId;该语句用来定义游标,其中FOR后面跟随的是你的查询语句,把查询出来的结果赋值给了nameCursor这个游标

2.1 遍历游标前一定要先打开游标 OPEN nameCursor;

2.2 遍历结束 一定要关闭游标,CLOSE nameCursor;如果不关闭当存储过程执行完遇到最后一个END的时候也会自动关闭。

3.DECLARE continue handler FOR SQLSTATE '02000' SET done = 1; 有很多人不知道这段是什么意思,我开始也不知道,首先本案例中这段话可以直接注释,没有作用,一般在没有条件体的循环体中使用,如:REPEAT statement_list UNTIL search_condition END REPEAT;循环体和LOOP 循环体使用的比较多。该句话的意思如注释所说,当你没有循环条件作为循环结束语句的时候,就可以用到上面DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;该句话的作用就是:当你游标在上述循环体中遍历结束的时候,就会执行该语句,让done =1;打个比方,假如你用的是REPEAT statement_list UNTIL search_condition END REPEAT;语句作为循环体,我们可写成UNTIL done因为REPEAT循环体执行顺序是先执行一次sql语句流然后再进行UNTIL done进行判断,当游标遍历结束,done=1然后循环体结束。SQLSTATE '02000'只是一个标识,具体可以官网查询。

然后再简单说下

label: LOOP
    statement_list

    IF done=1 THEN
        LEAVE label; 
    END IF; 
END LOOP label;

其中statement_list还是你需要执行的sql流,Loop和REPEAT有点像,都是先执行,再判断。我案例中是用的WHILE 该循环体是先判断条件,再执行,比较符合我当前的运用场景。

4. FETCH nameCursor INTO var_name;把当前游标指向的行赋值给变量,这里游标执行过程是顺序执行的,就相当于遍历数组,从第一个一直遍历到最后一个。

5. 如果需要把查询出来的结果,赋值给一个变量,可以使用into如这样:SELECT uuid into var_uuid FROM datadictionary WHERE ID=var_name;

6. 如果非查询赋值,可以用set如:SET i=i+1;

7. 获取一行游标中的多列值,只需定义和列关联的变量,然后用into进行赋值 如例2:FETCH nameCuursor INTO userid,depatementid;

总结

到此这篇关于MySql存储过程和游标使用的文章就介绍到这了,更多相关MySql存储过程游标使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql动态游标学习(mysql存储过程游标)

    复制代码 代码如下: -- 建立测试表和数据create table webuser (username varchar(10));insert into webuser values ('a1'),('a2'),('a3'),('b1'),('b2'),('b3');commit; -- 建立存储过程drop procedure if exists dynamic_cursor;delimiter //CREATE PROCEDURE dynamic_cursor (IN p_name var

  • mysql存储过程 游标 循环使用介绍

    Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程.今天分享下自己对于Mysql存储过程的认识与了解. 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子.这里主要说说大家常用的游标加循环的嵌套使用. 首先先介绍循环的分类: (1)WHILE ... END WHILE (2)LOOP ... END LOOP (3)REPEAT ... END REPEAT (4)GOTO 这里有三种标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种

  • Mysql存储过程中游标的用法实例

    本文实例讲述了Mysql存储过程中游标的用法.分享给大家供大家参考.具体如下: 1. 批量插入商户路由关联数据: DELIMITER $$ USE `mmm_mac`$$ DROP PROCEDURE IF EXISTS `批量插入商户路由关联数据`$$ CREATE DEFINER=`root`@`%` PROCEDURE `批量插入商户路由关联数据`() BEGIN DECLARE v_partner_no VARCHAR(32); DECLARE v_partner_id INT(11);

  • Mysql存储过程循环内嵌套使用游标示例代码

    BEGIN -- 声明变量 DECLARE v_addtime_begin varchar(13); DECLARE v_addtime_end varchar(13); DECLARE v_borrow_id int; DECLARE v_count int; DECLARE s1 int; /** 声明游标,并将查询结果存到游标中 **/ DECLARE c_borrow CURSOR FOR SELECT ID from rocky_borrow WHERE BORROWTYPE = 2

  • mysql存储过程中使用游标的实例

    复制代码 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day datetime)-- -- 实例-- MYSQL存储过程名为:getUserInfo-- 参数为:date_day日期格式:2008-03-08--    BEGINdeclare _userName varchar(12); -- 用户名declare _chinese int ; -

  • Mysql 存储过程中使用游标循环读取临时表

    游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR for table;(table也可以是select出来的结果集) 打开游标:Open 游标名称; 从结果集获取数据到变量:fetch 游标名称 into field1,field2; 执行语句:执行需要处理数据的语句 关闭游标:Close 游标名称; BEGIN # 声明自定义变量 declare

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

    mysql的存储过程.游标 .事务实例详解 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24)) BEG

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

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每行.mysql的游标为只读,不可滚动和敏感三种模式,我们来看下: 只读:无法通过光标更新基础表中的数据. 不可滚动:只能按照select语句确定的顺序获取行.不能以相反的顺序获取行. 此外,不能跳过行或跳转到结果集中的特定行. 敏感:有两种游标:敏感游标和不敏感游标.敏感游标指向实际数据,不敏感游标

  • MySQL存储过程中游标循环的跳出和继续操作示例

    最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1.REPEAT 复制代码 代码如下: REPEAT     Statements;   UNTIL expression END REPEAT demo DECLARE num INT; DECLARE my_string  VARCHAR(255);

  • MySql存储过程和游标的使用实例

    目录 前言 1.创建存储过程. 2.查看存储过程名称 3.调用存储过程 4.删除存储过程 总结 前言 这里存储过程和游标的定义和作用就不介绍了,网上挺多的,只通过简单的介绍,然后用个案例让大家快速了解.实例中会具体说明变量的定义,赋值,游标的使用,控制语句,循环语句的介绍. 1.创建存储过程. CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END 存储过程根据需要可能会有输入.输出.输

  • MySQL存储过程的概念与用法实例

    目录 概念 特性 存储过程通常有以下优点 格式 创建存储过程 定义变量 局部变量 用户变量 系统变量 存储过程 存储过程传参-in 存储过程传参-out 存储过程传参-inout 流程控制 流程控制-判断 流程控制语句-case 控制流程-循环 while循环 repeat循环 loop循环 游标 异常处理-HANDLER句柄 总结 概念 MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法,存储过就是数据库SQ

  • MySQL存储过程使用实例详解

    例1.一个简单存储过程游标实例 复制代码 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$CREATE PROCEDURE getUserInfo(in date_day datetime)-- -- 实例-- 存储过程名为:getUserInfo-- 参数为:date_day日期格式:2008-03-08--    BEGINdeclare _userName varchar(12); -- 用户名declare _chine

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

    本文实例讲述了mysql存储过程之错误处理.分享给大家供大家参考,具体如下: 当存储过程中发生错误时,重要的是适当处理它,例如:继续或退出当前代码块的执行,并发出有意义的错误消息.其中mysql提供了一种简单的方法来定义处理从一般条件(如警告或异常)到特定条件(例如特定错误代码)的处理程序.完事我们来使用DECLARE HANDLER语句来尝试声明一个处理程序,先来看语法: DECLARE action HANDLER FOR condition_value statement; 上述sql中,

  • MySQL存储过程图文实例讲解

    目录 MySQL的存储过程 MySQL存储过程的创建 1.简单实例 2.通过游标遍历结果集 总结 MySQL的存储过程 存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性. MySQL存储过程的创建 语法 CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参

  • php调用mysql存储过程实例分析

    本文实例分析了php调用mysql存储过程的方法.分享给大家供大家参考.具体分析如下: Mysql存储过程创建语法,代码如下: CREATE PROCEDURE和CREATE FUNCTION : 复制代码 代码如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]])       [characteristic ...] routine_body   CREATE FUNCTION sp_name ([func_parameter[,...]])

随机推荐