概述
MySQL - 循环与游标
- MySQL的控制流
- 1、if语句
- 2、case语句
- 3、循环语句
- MySQL的游标机制
- 定义处理程序
MySQL的控制流
if | case | leave(类似break) | iterate(类似continue) | repeat | while | loop
后三个可以实现循环
1、if语句
if 条件 then
语句;
end if
if 条件 then
语句;
else
语句;
end if
if 条件 then
语句;
elseif 条件 then
语句;
elseif 条件 then
语句;
...
end if
if 条件 then
语句;
else
if 条件 then
语句;
else
if 条件 then
语句;
...
end if
end if
end if
SELECT * FROM departments;
-- 用存储过程统计某个部门的员工人数,并根据人数输出范围 0-5、5-10、10-15、15-20、20以上
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `deptName` varchar(30),OUT `empCounts` int,OUT `CountScope` varchar(50))
BEGIN
#Routine body goes here...
declare rs int DEFAULT 0;
set rs = (SELECT count(employee_id) from employees
where department_id=
(select department_id from departments where department_name = deptName));
if rs<6 THEN
set CountScope='0~5人';
elseif rs<11 THEN
set CountScope='6~10人';
elseif rs<16 THEN
set CountScope='11~15人';
elseif rs<21 THEN
set CountScope='16~20人';
else
set CountScope='20人以上';
end if;
set empCounts=rs;
END;
call proc_empCount('IT',@empCount,@empCountScope);
SELECT @empCount,@empCountScope;
2、case语句
case 表达式
when 值1 then 表达式;
when 值2 then 表达式;
。。。
else 语句;
end case;
case 表达式
when 条件 then 语句;
when 条件 then 语句;
。。。
else 语句;
end case;
-- / 和 div 的区别
select 2/3, 2 div 3, 3 div 2;
-- 0.6667 0 1
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `deptName` varchar(30),OUT `empCounts` int,OUT `CountScope` varchar(50))
BEGIN
#Routine body goes here...
declare rs int DEFAULT 0;
set rs = (SELECT count(employee_id) from employees
where department_id=
(select department_id from departments where department_name = deptName));
case rs div 5
when 0 THEN set CountScope='0~5人';
when 1 THEN set CountScope='6~10人';
when 2 THEN set CountScope='11~15人';
when 3 THEN set CountScope='16~20人';
else set CountScope='20人以上';
end case;
set empCounts=rs;
END;
call proc_empCount('IT',@empCount,@empCountScope);
SELECT @empCount,@empCountScope;
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `deptName` varchar(30),OUT `empCounts` int,OUT `CountScope` varchar(50))
BEGIN
#Routine body goes here...
declare rs int DEFAULT 0;
set rs = (SELECT count(employee_id) from employees
where department_id=
(select department_id from departments where department_name = deptName));
case when rs<6 THEN set CountScope='0~5人';
when rs<11 THEN set CountScope='6~10人';
when rs<16 THEN set CountScope='11~15人';
when rs<21 THEN set CountScope='16~20人';
else set CountScope='20人以上';
end case;
set empCounts=rs;
END;
3、循环语句
(1)LOOP(带标号),实现一个简单的循环,本身没有停止循环的功能,需要通过leave来停止
标号: loop
循环体1
if 条件 then;
leave 标号; -- 跳出指定标号的循环
end if;
end loop 标号;
-- % 与 mod 效果相同
select 13%7,13 mod 7,mod(13,7); -- 6
6
6
-- 查找100以内能被7整除的数,找到5个停止查找
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `limitNum` int,IN `divNum` int,IN `maxNum` int)
NO SQL
COMMENT '查找100以内能被7整除的数,找到5个停止查找'
BEGIN
#Routine body goes here...
DECLARE x int DEFAULT 1;
DECLARE cnt int DEFAULT 0;
div_loop:loop
if x mod divNum = 0 then
set cnt = cnt+1;
select CONCAT(cnt,':',x) result; -- +不可以实现数据库的字符串拼接
if cnt = maxCount THEN
leave div_loop;
end if;
end if;
set x=x+1; -- 使x自增1,不可缺少
end loop div_loop;
END;
call proc_loop(100,7,2); -- 1:7
2:14
select 1+':'+7; -- +不可以实现数据库的字符串拼接
select 1+'12'+7; -- 20
select concat(1,':',7); -- 等价
select concat(concat(1,':'),7);
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `limitNum` int,IN `divNum` int,IN `maxCount` int)
NO SQL
COMMENT '查找100以内能被7整除的数,找到5个停止查找'
BEGIN
#Routine body goes here...
DECLARE x int DEFAULT 1;
DECLARE cnt int DEFAULT 0;
div_loop:loop
set x=x+1; -- 使x自增1,不可缺少
if x mod divNum = 0 then
set cnt = cnt+1;
select CONCAT(cnt,':',x) result; -- +不可以实现数据库的字符串拼接
if cnt = maxCount THEN
leave div_loop;
else
iterate div_loop;
end if;
end if;
end loop div_loop;
END;
(2)repeat:自身带有循环条件
标号:repeat
循环体;
until 循环终止条件
end repeat 标号;
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `limitNum` int,IN `divNum` int,IN `maxCount` int)
NO SQL
COMMENT '查找100以内能被7整除的数,找到5个停止查找'
BEGIN
#Routine body goes here...
DECLARE x int DEFAULT 1;
DECLARE cnt int DEFAULT 0;
div_loop:repeat
if x mod divNum = 0 then
set cnt = cnt+1;
select CONCAT(cnt,':',x) result; -- +不可以实现数据库的字符串拼接
end if;
set x=x+1; -- 使x自增1,不可缺少
until cnt=maxCount end repeat div_loop; -- until条件后不要用';'结束
END;
(3)while:自身带有循环条件,不满足条件时终止循环
标号:while 条件 do
循环体;
end while 标号;
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `limitNum` int,IN `divNum` int,IN `maxCount` int)
NO SQL
COMMENT '查找100以内能被7整除的数,找到5个停止查找'
BEGIN
#Routine body goes here...
DECLARE x int DEFAULT 1;
DECLARE cnt int DEFAULT 0;
while cnt < maxCount do
if x mod divNum = 0 then
set cnt = cnt+1;
select CONCAT(cnt,':',x) result; -- +不可以实现数据库的字符串拼接
end if;
set x=x+1; -- 使x自增1,不可缺少
end while;
END;
MySQL的游标机制
cursor(光标): 位于存贮过程中,常配合循环语句一起使用
SQL语言的执行特点:集合式操作
游标的作用:逐行提取SQL语句查询结果的信息
select * from departments;
DROP PROCEDURE IF EXISTS `proc_cursor`;
游标操作的步骤:
-
1、定义游标
declare 游标名 cursor for select 语句; -
2、打开游标
open 游标名 -
3、使用游标
call 游标名 -
4、关闭游标
close 游标名
定义处理程序
格式:
declare 处理程序的类型(continue | exists) handler for sqlstate 'code' | 错误编号 | 条件 当发生错误时要执行的操作
例:对向某个表中的插入数据时对主键重复进行处理
drop table if exists mytest;
create table mytest(id int primary key, name varchar(2));
drop procedure if exists proc_test_handler;
create procedure proc_test_handler()
comment'主键重复处理程序测试'
begin
-- 局部变量的定义
-- 定义条件
-- 游标定义
-- 定义处理程序
-- declare continue duplicate_handler handler for SQLSTATE '23000' set @j=100;
declare exit handler for 1062 set @j=300; -- exit会直接跳出
insert into mytest values(1,'aa');
insert into mytest values(1,'bb');
set @i=30;
select @i;
if @j=300 then
select '主键发生了重复';
end if;
end;
call proc_test_handler();
select @i,@j;
select * from mytest;
最后
以上就是自觉犀牛为你收集整理的MySQL - 循环与游标MySQL的控制流MySQL的游标机制定义处理程序的全部内容,希望文章能够帮你解决MySQL - 循环与游标MySQL的控制流MySQL的游标机制定义处理程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复