1. 光标的使用(游标)

  在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close。
  下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重要, 重点在于如何使用光标:

SELECT city_id FROM test.city

  

DELIMITER $$
CREATE PROCEDURE proc_demo_cursor()
BEGIN-- 定义变量,获取光标中的数据DECLARE city_id_staff SMALLINT DEFAULT 0;-- 声明光标DECLARE cur_city CURSOR FOR SELECT city_id FROM test.city;-- 定义条件  没有找到数据时退出光标 NOT FOUND CLOSE cur_cityDECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_city;    SET  @result=0;-- 打开光标OPEN cur_city;REPEATFETCH  cur_city INTO city_id_staff;IF city_id_staff < 10 THEN SET @result=@result+1;ELSE SET @result=@result+2;END IF;UNTIL 0 END REPEAT;-- 关闭光标CLOSE cur_city;
END $$
DELIMITER ;-- 调用
CALL proc_demo_cursor;
SELECT @result;

2. 流程控制

  包括 if ,case, loop, leave, iterate, repeat, while 语句进行流程控制

2.1  IF 语句

--  语法如下
IF search_condition THEN statement_list
[ELSE IF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
-- 举例
IF city_id_staff < 10 THEN SET @result=@result+1;
ELSE SET @result=@result+2;
END IF;

2.2 CASE 语句

--  举例二种用法
CASE
WHEN i_staff_id = 2 THENSET @x1 = @x1 + d_amount;
ELSESET @x2 = @x2 + d_amount;
END CASE;
-- 或者:
CASE i_staff_id
WHEN 2 THENSET @x1 = @x1 + d_amount;
ELSESET @x2 = @x2 + d_amount;
END CASE;

2.3  loop 语句

  loop 实现简单的循环,退出循环条件可以使用leave语句。

DELIMITER $$
CREATE PROCEDURE proc_demo_loop()
BEGINDECLARE increase INT DEFAULT 1;SET @x=0;ins: LOOPSET increase=increase+1;  IF increase =100 THENSET @x=increase;-- 退出
        LEAVE ins;END IF;END LOOP ins;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_loop;
SELECT @x;

2.4  ITERATE语句

  ITERATE该语句必须用在循环中,作用相当于for 中的continue, 跳过当前循环剩下的语句,直接进入下一轮循环。

DELIMITER $$
CREATE PROCEDURE proc_demo_iterate()
BEGINDECLARE increase INT DEFAULT 1;SET @x=0;ins: LOOPSET increase=increase+1;  IF increase =100 THEN-- 退出
        LEAVE ins;ELSEIF MOD(increase,2)=0 THEN-- 返回
        ITERATE ins;END IF;SET @x=@x+1;END LOOP ins;
END $$
DELIMITER ;
-- 调用
CALL proc_demo_iterate;
SELECT @x;

  

2.5 repeat 语句

  有条件的循环控制语句,当满足条件的时候退出循环,在上面的光标也是一种循环,使用repeat来退出光标,使用close来关闭光标。

-- 语法
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]--  举例(UNTIL 0 END REPEAT)退出 当search_condition为0时,使用END REPEAT退出
    REPEATFETCH  cur_city INTO city_id_staff;IF city_id_staff < 10 THEN SET @result=@result+1;ELSE SET @result=@result+2;END IF;UNTIL 0 END REPEAT;

2.6 while 语句

  也是有条件的循环控制语句,当满足条件的时候退出循环。WHILE 循环和REPEAT 循环的区别在于:WHILE 是满足条件才执行循环,REPEAT 是满足条件退出循环;WHILE 在首次循环执行之前就判断条件,所以循环最少执行0 次,而REPEAT 是在首次执行循环之后才判断条件,所以循环最少执行1 次。 相当于开发语言的while(bool) 和do while(bool)。

DELIMITER $$
CREATE PROCEDURE proc_demo_while()
BEGINDECLARE increase INT DEFAULT 1;SET @x=0;WHILE increase<=10 DOSET increase=increase+1;SET  @x=@x+increase;END WHILE;
END $$
DELIMITER ;-- 调用
CALL proc_demo_while;
SELECT @x;

  

转载于:https://www.cnblogs.com/MrHSR/p/9293744.html

mysql 开发基础系列18 存储过程和函数(下)相关推荐

  1. mysql 开发基础系列22 SQL Model(带迁移事项)

    一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...

  2. mysql 开发基础系列19 触发器

    触发器是与表有关的数据库对象,触发器只能是针对创建的永久表,而不能是临时表. 1.1 创建触发器 -- 语法: CREATE TRIGGER trigger_name trigger_time tri ...

  3. 掌握web开发基础系列--物理像素、逻辑像素、css像素

    思考一下 什么是物理像素?什么是css像素? 在 <掌握web开发基础系列--长度单位> 这篇文章中已经介绍过了css像素单位--px,这篇文章详细探讨一下设备物理像素和css像素之间的关 ...

  4. mySQL教程 第7章 存储过程和函数

    第7章 存储过程和函数 存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储 ...

  5. mySQL 教程 第7章 存储过程和函数

    存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ...

  6. asp.net控件开发基础系列

    本系列文章示例源码下载.各位如遇问题,请多查msdn,多利用网络.本人可能没时间一一回复,谢谢你们的支持,希望看到此文的人都能学好控件开发 http://www.cnblogs.com/Clingin ...

  7. MySQL高级篇-彻底掌握存储过程和函数

      MySQL从5.0版本开始支持存储过程和函数.存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可. 1.存储过 ...

  8. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性

    系列目录     [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取单文件/模型下单个构建的属性信息. 请求地址:GET https://api.bimface.com/data/v2/fil ...

最新文章

  1. java中hashMap的排序
  2. 一文带你了解光纤收发器和交换机之间的区别
  3. 程序员减轻压力的十个建议
  4. Python 2.7:字符串乱码问题的解决
  5. 通达信版弘历软件指标_通达信弘历趋势王指标
  6. Spring Boot 2.3.3 正式发布!
  7. 编程学习记录11:Oracle数据库的一些基本操作1,创建用户,授权
  8. 总结下MySql优化。防止数据灾难的发生。
  9. Docker的八种用途
  10. ActiveReport报表模板库新增21张报表模板,加入报表导出功能!
  11. 计算机的最简单的操作,电脑无线投屏怎么使用(手把手教你最简单且实用的操作方法)...
  12. NAT 穿透是如何工作的:技术原理及企业级实践
  13. 安卓ps模拟器_用电脑玩安卓游戏!逍遥模拟器免安装版PC软件
  14. Open3D-GUI系列教程(七)打包应用程序
  15. 维特比算法在隐马尔可夫模型中的应用
  16. python从视频中提取音频信号_通过python从音频文件中提取音频
  17. 什么是驱动?驱动程序的工作原理?
  18. 【Leetcode】1386. Cinema Seat Allocation
  19. 白宫举办开源安全峰会,众多科技巨头参加
  20. 高阶函数、列表/集合/字典/推导式、递归函数

热门文章

  1. 2011最新个人所得税计算器---起点3500元
  2. 使COUNT(*)查询总数变快
  3. 企业做大的捷径:“复印”成功的商业模式
  4. Scala数值类型转换
  5. 《解释性机器学习》笔记(五):Rule Fit 规则拟合
  6. 免费的文本分析 文本挖掘软件工具
  7. .Net IL代码研究
  8. Windows下以Local模式调试SparkStreaming的WordCount例子
  9. 在Windows上运行Spark程序
  10. Jquery : 上下滚动--单行 批量多行 文字图片翻屏【转】