关键词:
阅读目录:通过条件、循环语句,对处理程序进行流程控制
- 条件控制
IF条件:条件为真,执行
CASE条件:匹配到,执行
- 循环控制
WHILE循环:先判断后执行
REPEAT循环:先执行后判断
LOOP循环(死循环)
LEAVE语句(离开)
ITERATE语句:迭代,再次循环
RETURN语句:返回
注意:MySQL不支持FOR循环
一、条件控制:if语句、case语句
IF search_condition_1 THEN statement_list_1
[ELSEIF search_condition_2 THEN statement_list_2] ...
[ELSE statement_list_n]
END IF
如果条件search_condition_1为true,则执行相应的then子句后面的语句列表statement_list_1;
如果条件search_condition_1不为true,则判断ELSEIF子句中的条件search_condition_2是否为true,如果为true,则执行相应的then子句后面的语句列表statement_list_2;
……
如果所有的条件都不为true,则执行ELSE子句后面的语句。
例1:创建过程,判断两个输入参数哪一个大
mysql> DELIMITER $$
mysql> CREATE PROCEDURE difference(
-> IN p1 INTEGER,
-> IN p2 INTEGER,
-> OUT p3 INTEGER)
-> BEGIN
-> IF p1 > p2 THEN SET p3 = 1;
-> ELSEIF p1= p2 THEN SET p3 = 2;
-> ELSE SET p3 = 3;
-> END IF;
-> END $$
mysql> DELIMITER ;
mysql> call difference(12,56,@ax);
mysql> select @ax;
+------+
| @ax |
+------+
| 3 |
+------+
解析:输入的第一个参数对应p1,第二个对应p2,@ax用来接收输出变量p3;如果p1>p2,输出1;如果p1=p2,输出2;其他情况,输出3。
例2:创建过程,表示出players表和penalties表哪一个行数更多--->IF条件中允许包含标量子查询
mysql> create procedure `TENNIS`.`largest`(out t char(10))
-> begin
-> if (select count(*) from PLAYERS)>(select count(*) from PENALTIES)
-> then
-> set t=‘PLAYERS‘;
-> elseif (select count(*) from PLAYERS)=(select count(*) from PENALTIES)
-> then
-> set t=‘equal‘;
-> else
-> set t=‘PENALTIES‘;
-> end if;
-> end $$
mysql> delimiter ;
mysql> call largest(@lgt);
mysql> select @lgt;
+---------+
| @lgt |
+---------+
| PLAYERS |
+---------+
1)simple case:简易case语句
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
case_value是一个表达式,该值和每个when子句中的when_value值进行相等比较:
①如果和某个when子句中的when_value值相等,则执行相应的then子句后面的语句statement_list;
②如果没有when_value值相等,则执行else子句后面的statement_list。
mysql> DELIMITER $$
mysql> CREATE PROCEDURE p1()
-> BEGIN
-> DECLARE v INT DEFAULT 3;
-> CASE v
-> WHEN 2 THEN SELECT v;
-> WHEN 3 THEN SELECT 0;
-> ELSE
-> BEGIN
-> END
-> END CASE;
-> END $$
mysql> DELIMITER ;
mysql> call p1();
+---+
| 0 |
+---+
| 0 |
+---+
2)searched case:检索型case语句
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
对于每个when子句,判断后面的布尔表达式search_condition是否为true:
①如果某个when子句的条件为true,则执行相应的then子句后面的语句statement_list;
②如果所有的when子句的条件都不为true,则执行else后面的语句statement_list。
mysql> DELIMITER $$
mysql> CREATE PROCEDURE p2(
-> IN p1 INTEGER,
-> IN p2 INTEGER,
-> OUT p3 INTEGER)
-> BEGIN
-> CASE
-> WHEN p1>p2 THEN SET p3=1;
-> WHEN p1=p2 THEN SET p3=2;
-> ELSE SET p3 = 3;
-> END CASE;
-> END$$
mysql> DELIMITER ;
mysql> call p2(123,321,@ax);
mysql> select @ax;
+------+
| @ax |
+------+
| 3 |
+------+
注意:
①如果在case中,没有一个when子句的比较结果为true,并且没有写else部分,那么就抛出异常:‘Case not found for CASE statement’;
②statement_list如果有多条语句,使用begin…end块包围起来(复合语句)。
二、循环控制:while循环、repeat循环、loop循环、leave语句、iterate语句
Tips:循环体结构
①条件
②SQL语句体
③程序体里面需要对条件中的变量进行处理
[begin_label:] WHILE search_condition DO
statement_list;
END WHILE [end_label];
首先判断循环开始条件search_condition是否为true(循环结束条件):
如果为true,则执行循环体中的语句statement_list。每执行完一次,都要重新判断条件search_condition是否为true;
如果条件search_condition为false,则循环结束。
特点:
先判断,后执行
mysql> DELIMITER $$
mysql> CREATE PROCEDURE do_while(x int)
-> BEGIN
-> DECLARE v INT DEFAULT 5;
-> set v=x;
-> WHILE v>0 DO
-> select v;
-> SET v=v-1;
-> END WHILE;
-> END$$
mysql> DELIMITER ;
mysql> call do_while(2);
+------+
| v |
+------+
| 2 |
+------+
+------+
| v |
+------+
| 1 |
+------+
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
反复执行循环体中的语句statement_list,直到until条件search_condition 为true时,循环结束
特点:
先执行,后判断
mysql> DELIMITER $$
mysql> CREATE PROCEDURE dorepeat(p1 INT)
-> BEGIN
-> SET @x=0;
-> REPEAT
-> SET @x = @x + 1;
-> UNTIL @x > p1 END REPEAT;
-> END$$
mysql> DELIMITER ;
mysql> CALL dorepeat(1000);
mysql> SELECT @x;
+------+
| @x |
+------+
| 1001 |
+------+
@x:用户变量,直接使用“set @x=0;”就可以生成这么一个变量,不需要数据类型,在存储过程里定义的用户变量,存储过程外面可以访问,一直被保存。
[begin_label:] LOOP
statement_list ;
END LOOP [begin_label];
反复执行循环体中的语句,直到循环结束;
循环的结束使用leave语句。
例:创建过程,等待指定的秒数后结束
mysql> delimiter $$
mysql> create procedure wait_s(in wait_seconds int)
-> begin
-> declare end_time datetime default now() + interval wait_seconds second; #interval是间隔类型关键字
-> wait_loop:loop
-> if now() > end_time
-> then
-> leave wait_loop; #leave语句表离开
-> end if;
-> end loop wait_loop;
-> end $$
mysql> delimiter ;
mysql> call wait_x(10);
……等10秒,结束……
LEAVE label ;
作用:用来退出带标签的语句块或者循环
用处:用在 BEGIN ... END中或者循环中 (LOOP, REPEAT, WHILE)
例:创建过程,其中的一个语句块较早的结束
mysql> DELIMITER $$
mysql> CREATE PROCEDURE small_exit(OUT p1 INTEGER,OUT p2 INTEGER)
-> BEGIN
-> SET p1 = 1;
-> SET p2 = 1;
-> block1:BEGIN
-> LEAVE block1; #离开块block1
-> SET p2 = 3; #已离开,不执行
-> END block1;
-> SET p1 = 4; #执行
-> END$$
mysql> DELIMITER ;
mysql> call small_exit(@r1,@r2);
mysql> select @r1,@r2;
+------+------+
| @r1 | @r2 |
+------+------+
| 4 | 1 |
+------+------+
ITERATE label;
只能出现在循环LOOP、REPEAT和WHILE 中(有标签)
含义:跳出本次循环,开始一次新的循环
mysql> delimiter $$
mysql> CREATE PROCEDURE do_iterate(p1 INT)
-> BEGIN
-> label_1: LOOP
-> SET p1 = p1 + 1;
-> IF p1 < 10 THEN ITERATE label_1; #开始下一次循环
-> END IF;
-> LEAVE label_1;
-> END LOOP label_1;
-> SET @x = p1;
-> END$$
mysql> delimiter ;
mysql> call do_iterate(1);
mysql> select @x;
+------+
| @x |
+------+
| 10 |
+------+
shell脚本之流程控制
shell脚本之流程控制shell脚本之流程控制条件语句条件判断循环语句for,while,untilfor循环while循环until循环循环控制语句continue循环控制语句break循环控制shift命令创建无限循环while的特殊用法for的特殊用法select循环与菜单s... 查看详情
javascript基础之流程控制语句
第三部分:流程控制语句JavaScript代码是书写位置:JavaScript代码应该写在<scripttype=”text/javascript”></script>这一对标记中。或者作为外部引用<scriptsrc="JavaScript代码路径"></script>JavaScript的每一句代码请用分号作为... 查看详情
python之流程控制(代码片段)
Python之流程控制if语句条件判断语句ifa==b:pass#满足条件再执行ifa==b:passelse:pass#满足条件执行第一种语句,不满足条件则执行第二种语句ifa==b:#条件1pass#语句1elifa>b:#条件2pass#语句2else:pass#语句3如果满足条件1,则执行语句1,语句2... 查看详情
java篇之流程控制语句
条件判断语句 条件语句:If(boolean类型)else (打大括号避免出错) switch(export)语句:export的类型必须是byte,short,char,int,Stringenum;Switch(export){Case(n):语句;Break;(不输入它的话会顺序执行下一分支,遇到才会跳... 查看详情
java学习之流程控制语句(选择结构)
流程控制语句1选择结构ifif语句有三种语法格式,每一种格式都有它自身的特点。1.1if语句if语句是指如果满足某种条件,就进行某种处理。在Java中,if语句的具体语法格式如下:if(条件语句){ 执行语句; ... 查看详情
puppet之流程控制介绍
1 概述puppet流程控制语句有四种,if,case,selector,unless(3.7版本后引入),由于unless是if单分支语句取反,因此,本文重点介绍if,case,selector三种语法的使用备注:本文的相关内容摘自文章:https://www.dwhd.org/20150609_155030.html2 if语... 查看详情
java基础之流程控制
一、顺序结构 顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。 if-else-if语句语法: if(条件){ 当条件为true时,执行大括号内... 查看详情
阿花宝宝java基础笔记之流程控制
1.各循环可互相嵌套 一般不超过三层 外层循环变量变化一次,内层循环变量要变化一遍 注意点:循环次数。(内层循环次数*外层循环次数)2.break语句的使用 break语句用于终止某个循环,使... 查看详情
java程序猿之流程控制与数组
分支语句 if括号里的只能是一个逻辑表达式,即这个表达式返回的值只能是true或false。 代码块用花括号括起来,一个代码块通常被当成一个整体来执行(除非遇到return、break、continue等关键字,或者遇到异常)。 ... 查看详情
1.golang开发之流程控制(代码片段)
Golang开发之流程控制1.条件判断(if)Go语言if条件判断格式如下:if表达式1分支1elseif表达式2分支2else分支3Go规定与if匹配的左括号“”必须与if和表达式放在同一行,如果尝试将“”放在其它位置,将会触发编译错误,... 查看详情
基本语法之流程控制之关键字:break和continue
break和continue关键字的使用 使用范围 循环中使用的作用(不同点) 相同点 break: switch-case 循环结构中 结束当前循环 关键字后面不能声明执行语句 continue: 循环结构中 结束当次循环 关键字后面不能声明... 查看详情
2_基本语法之流程控制之循环结构
... 2.1for循环结构 for(①;②;④) ③ 执行过程:①-②-③-④-②-③-④-...-② 2.2while循环结构 ① while(②) ③; ④; 执 查看详情
go语言学习——go语言基础之流程控制二
使用switch语句方便对大量的值进行条件判断packagemainimport"fmt"//流程控制之跳出for循环funcmain()//当i=5时就跳出for循环fori:=0;i<10;i++ifi==5break//跳出for循环 查看详情
go语音基础之流程控制if语句
Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。顺序结构:程序按顺序执行,不发生跳转。 选择结构:依据是否满足条件,有选择的执行相应功能。循环结构:依据条件是否满足,循环多次执行某... 查看详情
java基础之流程语句(代码片段)
JAVA流程语句有几下几种:一、if语句:1.if语句:如果满足条件语句,则执行执行语句; if(条件语句) 执行语句; ....; 2.if....else语句:如果满足判断语句,则执行执行语句1,否则执行执行语句2;... 查看详情
阿花宝宝java基础笔记之流程控制
1.语法:if(条件1){ //代码1 }elseif(条件2){ //代码块2& 查看详情
java从入门到入坟之流程控制语句大全(代码片段)
目录1,顺序结构(最基本的结构)2,选择结构:1):if单选择结构:2):if双选择结构3):if多选择结构4)嵌套的if结构3,循环结构 1)while循环2)dowhile循环3)for循... 查看详情
go语言基础之流程控制(代码片段)
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制... 查看详情