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_city
DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_city; SET @result=0; -- 打开光标
OPEN cur_city;
REPEAT
FETCH 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 THEN
SET @x1 = @x1 + d_amount;
ELSE
SET @x2 = @x2 + d_amount;
END CASE;
-- 或者:
CASE i_staff_id
WHEN 2 THEN
SET @x1 = @x1 + d_amount;
ELSE
SET @x2 = @x2 + d_amount;
END CASE;

2.3  loop 语句

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

DELIMITER $$
CREATE PROCEDURE proc_demo_loop()
BEGIN
DECLARE increase INT DEFAULT 1;
SET @x=0;
ins: LOOP
SET increase=increase+1;
IF increase =100 THEN
SET @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()
BEGIN
DECLARE increase INT DEFAULT 1;
SET @x=0;
ins: LOOP
SET 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退出
REPEAT
FETCH 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()
BEGIN
DECLARE increase INT DEFAULT 1;
SET @x=0;
WHILE increase<=10 DO
SET increase=increase+1;
SET @x=@x+increase;
END WHILE;
END $$
DELIMITER ; -- 调用
CALL proc_demo_while;
SELECT @x;

  

mysql 开发基础系列18 存储过程和函数(下)的更多相关文章

  1. mysql 开发基础系列17 存储过程和函数(上)

    一. 概述 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的.存储过程和函数的区别在 ...

  2. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  3. mysql 开发基础系列5 字符串函数

    字符串函数 1.  concat (s1,s2,...sn) 连接里面的参数成一个字符串(注意上面写错了函数名称) SELECT CONCAT('ddd','CCC'); 2.  insert(str ...

  4. mysql 开发基础系列7 流程函数与其它函数

    一.流程函数 -- 创建表来介绍 ,)); ,),(,), (,),(,),(,), (,NULL); SELECT * FROM salary 1. if(value,t,f)  超过2000的用h ...

  5. mysql 开发基础系列6 数值与日期函数

    一. 数值函数 1.  abs(x) 返回x的绝对值 SELECT ABS(-0.8),ABS(0.8); 2.ceil(x) 返回大于x的最大整数 SELECT CEIL(-0.8),CEIL(0. ...

  6. mysql 开发基础系列20 事务控制和锁定语句(上)

    一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...

  7. mysql 开发基础系列1 表查询操作

    在安装完数据库后,不管是windows 还是linux平台,  mysql的sql命令都大同小异,相关命令都是相同的,每个命令结束后 都以  ;  结尾, 注意在windows平台中表名是不区分大小写 ...

  8. mysql 开发基础系列22 SQL Model

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

  9. mysql 开发基础系列21 事务控制和锁定语句(下)

    1.  隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...

随机推荐

  1. Java: 集合类详解

    0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ...

  2. 89、instancetype和id的区别

    1>instancetype在类型表示上,跟id一样,可以表示任何对象类型 2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上 3>instancetyp ...

  3. Pycharm下面出现No R interpreter defined

    安装Pycharm进行Python开发时,经常右下角提示No R interpreter defined,处理方式: 1.安装R,然后将R的路径添加到Pycharm中: 2.如果不需要进行R语言开发, ...

  4. Django积木块七——视频

    视频 # 在网上搜索video.js然后下载相关的js和css文件,看文档正确使用视频模块,添加视频外链 <div style="width: 1200px;height: 675px ...

  5. C# 自动程序 windows 无法启动 XXXX 服务 错误5 拒绝访问

    遇到过两次 这样的问题了,所以记录一下 原因可能是服务所在文件的目录权限不够 解决方法: 1是查看服务对应的程序所在的目录 2是设置目录的安全权限 右击–属性–安全–添加相应的帐号,给予除完全控制外的 ...

  6. MFC图片操作

    根据MFC要操作图片的来源,可分为以下两类: 一.非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) 二.动态载入图片(即只需要在程序中指定图片的路径即可载入) 一.非动态显示图片 1.传送 ...

  7. 手动模拟attach cinder volume的过程

    我们首先启动一台机器,启动的时候attach一个volume 创建一个空的cinder volume root:~# cinder create --display-name emptyvolume1 ...

  8. [转] 如何用kaldi训练好的模型做特定任务的在线识别

    转自:http://blog.csdn.net/inger_h/article/details/52789339 在已经训练好模型的情况下,需要针对一个新任务做在线识别应该怎么做呢? 一种情况是,用已 ...

  9. 谈谈npm依赖管理

    引言 现在的前端开发几乎都离不开nodejs的包管理器npm,比如前端在搭建本地开发服务以及打包编译前端代码等都会用到.在前端开发过程中,经常用到npm install来安装所需的依赖,至于其中的技术 ...

  10. 微信小程序中如何使用WebSocket实现长连接(含完整源码)

    本文由腾讯云技术团队原创,感谢作者的分享. 1.前言   微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架.组件以及 API,在这个平台上面的想象空间很大.腾讯云研究了一番之后,发现 ...