1.标签语句

[begin_label:] BEGIN
[statement_list]
END [end_label] [begin_label:] LOOP
statement_list
END LOOP [end_label] [begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label] [begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
  • 标签label可以加在begin...end语句以及loop,repeat和while语句上
  • 语句中通过iterate和leave来控制流程,iterate表示返回指定标签位置,leave表示跳出标签

实例:

mysql> delimiter //
mysql> create procedure doiterate(in p1 int,out p2 int)
-> begin
-> label1:loop
-> set p1 = p1 + 1;
-> if p1 < 10 then iterate label1;end if;
-> leave label1;
-> end loop label1;
-> set p2=p1;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call doiterate(1,@a);
Query OK, 0 rows affected (0.00 sec) mysql> select @a;
+------+
| @a |
+------+
| 10 |
+------+
1 row in set (0.00 sec) mysql> call doiterate(5,@a);
Query OK, 0 rows affected (0.00 sec) mysql> select @a;
+------+
| @a |
+------+
| 10 |
+------+
1 row in set (0.00 sec)

2.Declare语句

语法:

DECLARE var_name [, var_name] ...  type [DEFAULT value]
  • Declare语句通常声明本地变量、游标、条件或者handler
  • Declare语句只允许出现在begin...end语句中而且必须出现在第一行
  • Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
  • 使用default指定变量的默认值,如果没有指定默认值则为NULL
  • 声明的变量和被引用的数据表中的字段要区分开

存储过程中的变量

  • 本地变量可以通过declare语句声明
  • 声明后的变量可以通过select...into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch...into var_list赋值
mysql> delimiter //
mysql> create procedure sp1(v_sid int)
-> begin
-> declare xname varchar(64) default 'bob';
-> declare xgender int;
-> select sname,gender into xname,xgender from students where sid=v_sid;
-> select xname,xgender;
-> end//
Query OK, 0 rows affected (0.01 sec) mysql> delimiter ;
mysql>
mysql> call sp1(1);
+--------+---------+
| xname | xgender |
+--------+---------+
| Andrew | 1 |
+--------+---------+
1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

3.流程控制语句

(1)case语句

在存储过程或函数中表明复杂的条件选择语句。

语法:

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE Or: CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE

说明:

  • case_value与when_value依次做相等对比,如果相等则执行对应的后面的SQL语句,否则接着对比;
  • 当search_condition满足true/1的结果时,则执行对应的SQL语句,否则执行else对应的SQL语句;

实例:

mysql> delimiter //
mysql> create procedure exp_case(v_sid int)
-> begin
-> declare v int default 1;
-> select gender into v from students where sid=v_sid;
-> case v
-> when 0 then update students set gender=1 where sid=v_sid;
-> when 1 then update students set gender=0 where sid=v_sid;
-> else
-> update students set gender=-1 where sid=v_sid;
-> end case;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql>
mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | 1 | 1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec) mysql> call exp_case(1);
Query OK, 1 row affected (0.03 sec) mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | 0 | 1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec) 另一种写法:
mysql> delimiter //
mysql> create procedure exp_case2(v_sid int)
-> begin
-> declare v int default 1;
-> select gender into v from students where sid=v_sid;
-> case
-> when v=0 then update students set gender=1 where sid=v_sid;
-> when v=1 then update students set gender=0 where sid=v_sid;
-> else
-> update students set gender=-1 where sid=v_sid;
-> end case;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call exp_case2(1);
Query OK, 1 row affected (0.03 sec) mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | 1 | 1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)

(2)IF语句

在存储过程或函数中表明基础的条件选择语句

语法:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
  • 如果search_condition满足true/1的条件,则执行对应的SQL语句,否则再判断elseif中的search_condition,都不满足则执行else中的SQL语句;
  • statement_list中可以包含一个或多个SQL语句

实例:

mysql> delimiter //
mysql> create function SimpleCompare(n int,m int)
-> returns varchar(20)
-> begin
-> declare s varchar(20);
-> if n > m then set s = '>';
-> elseif n = m then set s = '=';
-> else set s = '<';
-> end if;
-> set s = concat(n,'',s,'',m);
-> return s;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql>
mysql> select SimpleCompare(5,6);
+--------------------+
| SimpleCompare(5,6) |
+--------------------+
| 5<6 |
+--------------------+
1 row in set (0.00 sec) mysql> select SimpleCompare(15,34);
+----------------------+
| SimpleCompare(15,34) |
+----------------------+
| 15<34 |
+----------------------+
1 row in set (0.00 sec) mysql> select SimpleCompare(78,78);
+----------------------+
| SimpleCompare(78,78) |
+----------------------+
| 78=78 |
+----------------------+
1 row in set (0.00 sec)

IF嵌套:

mysql> delimiter //
mysql> create function verboseCompare(n int,m int)
-> returns varchar(50)
-> begin
-> declare s varchar(50);
-> if n = m then set s = 'equals';
-> else
-> if n > m then set s = 'greater';
-> else set s = 'less';
-> end if;
-> set s = concat('is',s,'than');
-> end if;
-> set s = concat(n,'',s,'',m,'.');
-> return s;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> select verboseCompare(4,5);
+---------------------+
| verboseCompare(4,5) |
+---------------------+
| 4islessthan5. |
+---------------------+
1 row in set (0.00 sec)

(3)iterate语句

仅出现在loop,repeat,while循环语句中,表示重新开始此循环。

语法:

ITERATE label

(4)leave语句

表明指定标签的流程控制语句块,通常用在begin...end,以及loop,repeat,while循环汇总;

LEAVE label

实例:

mysql> delimiter //
mysql> create procedure doiterate2(in p1 int,out p2 int)
-> begin
-> label1:loop
-> set p1=p1+1;
-> if p1 < 10 then iterate label1;end if;
-> leave label1;
-> end loop label1;
-> set p2=p1;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;

(5)loop语句

在存储过程或函数中表达循环执行的一种方式;

语法:

[begin_label:] LOOP
statement_list
END LOOP [end_label]

实例:

mysql> delimiter //
mysql> create procedure doiterate3(p1 int)
-> begin
-> label1:loop
-> set p1=p1+1;
-> if p1<10 then iterate label1;end if;
-> leave label1;
-> end loop label1;
-> set @x=p1;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;

(6)repeat语句

在存储过程或函数中表达循环执行的一种方式;

语法:

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

实例:

mysql> delimiter //
mysql> create procedure doiterate4(p1 int)
-> begin
-> set @x=0;
-> repeat
-> set @x=@x+1;
-> until @x>p1 end repeat;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> call doiterate4(1000);
Query OK, 0 rows affected (0.02 sec) mysql> select @x;
+------+
| @x |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

(7)while语句

在存储过程或函数中表达循环执行的一种方式;

语法:

[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
  • 当search_condition返回true时,循环执行SQL语句,直到search_condition为false;

实例:

mysql> delimiter //
mysql> create procedure dowhile()
-> begin
-> declare v1 int default 5;
-> while v1>0 do
-> update students set gender=-1 where sid=v1;
-> set v1=v1-1;
-> end while;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> call dowhile();
Query OK, 1 row affected (0.63 sec) mysql> select * from students;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | -1 | 1 |
| 2 | Andy | -1 | 1 |
| 3 | Bob | -1 | 1 |
| 4 | Ruth | -1 | 2 |
| 5 | Mike | -1 | 2 |
| 6 | John | 0 | 3 |
| 7 | Cindy | 1 | 3 |
| 8 | Susan | 1 | 3 |
+-----+--------+--------+---------+
8 rows in set (0.00 sec)

(8)return语句

在函数中,用来终结函数的执行并将指定值返回给调用者;

语法:

RETURN expr
  • 在函数中必须有至少一个return语句,当有多个return语句时则表明函数有多种退出方式;

实例:

mysql> delimiter //
mysql> create function doreturn()
-> returns int
-> begin
-> select gender into @a from students where sid = 1;
-> if @a=1 then return 1;
-> elseif @a=0 then return 0;
-> else return 999;
-> end if;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> select doreturn();
+------------+
| doreturn() |
+------------+
| 999 |
+------------+
1 row in set (0.00 sec) mysql> select * from students where sid = 1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | -1 | 1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)

MySQL-5.7 高阶语法及流程控制的更多相关文章

  1. Cmd Markdown 高阶语法手册

    『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 高阶语法手册 1. 内容目录 在段落中填写 [TOC] 以显示全文内容的目录结构. [TOC] 2. 标签分类 在编辑 ...

  2. Java高阶语法---transient

    背景:听说transient Java高阶语法是挺进BAT必经之路. transient: Java中transient 关键字的作用,简单的说就是让某些被修饰的成员属性变量不被序列化. 这又扯到了序 ...

  3. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  4. Java高阶语法---Volatile

    背景:听说Volatile Java高阶语法亦是挺进BAT的必经之路. Volatile: volatile同步机制又涉及Java内存模型中的可见性.原子性和有序性,恶补基础一波. 可见性: 可见性简 ...

  5. Java高阶语法---final

    背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...

  6. Markdown 高阶语法

    记录一些 Markdown 的高阶语法,想起来什么,再更新 分割线 两条分割线 *** *** 插入表格 Column Column Column Row Content Content | Colu ...

  7. Java基础语法(4)-流程控制

    title: Java基础语法(4)-流程控制 blog: CSDN data: Java学习路线及视频 1.程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定 ...

  8. 【Java基础】基本语法-程序流程控制

    基本语法-程序流程控制 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺 ...

  9. Java基础语法与流程控制

    Java基础语法与流程控制 跟着狂神学Java的第二天O(∩_∩)O~,养成一个总结的习惯 志同道合的小伙伴可以一起学习狂神的视频 本节地址:https://www.kuangstudy.com/co ...

随机推荐

  1. Android中TextView和EditView经常使用属性设置

    Android开发中最经常使用的几乎相同就是TextView和EditView了,在使用它时.我们也会设置它的一些属性,为了让我们设计的更好看,设置的更合理.这里记下它的经常使用属性,方便后期查阅. ...

  2. cobbler 修改 distro_signatures.json

    edit file in /var/lib/cobbler/distro_signatures.json and restart cobblerd service 转自: https://lists. ...

  3. (转)TCP三次握手四次挥手

    转自:http://www.jellythink.com/archives/705 参考:http://blog.csdn.net/whuslei/article/details/6667471 [注 ...

  4. SQL Server跨server之间訪问

    在两个server都须要启用Ad Hoc Distributed Queries: EXEC sp_configure 'show advanced options', 1 RECONFIGURE E ...

  5. win 8升级win8.1的几个问题

        对于习惯了win7来说的小朋友,win8的使用简直有种想砸电脑的冲动啊,特别是玩游戏的小朋友,win8各种bug.对于游戏.咳咳,我只是多说了,我们都是爱学习的好孩子,少玩游戏,少撸.简单说一 ...

  6. uWSGI配置(转 )

    原文地址:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html 下面的内容包含了大部分uWSGI的配置选项,这些配置选项的列举没有 ...

  7. 带jsk证书,请求https接口

    首先是三个返回的实体类 BaseVo.java package https2; import java.io.Serializable; import java.lang.reflect.Invoca ...

  8. Powershell实现Telnet Port

    Telnet Port 脚本 $servers = get-content D:\ps\ServerIPAddress.TXT $portToCheck = '80' for($i=1;$i -le ...

  9. Downgrading an Exchange 2010 Server(Exchange降级)

    Downgrading an Exchange 2010 Server Microsoft Exchange Server 2010 comes in two versions: enterprise ...

  10. 超过70亿条数据的mysql 去重

    1.数据库层面: 2.业务层面:接口去重.浏览器显示端去重: