Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)
最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法。本篇文章主要包括介绍了存储过程的5个小语法:declare语句的变量、定义条件、处理程序、光标、流程控制构造。在找了很久的资料后,其实发现最实在的资料就是官方的参考手册。我参考的是MySQL5.1参考手册官方简体中文版.chm。
存储过程:为以后的使用而保存的一条或多条Mysql语句的集合。
DECLARE 语句:不同项目局域到一个子程序:局部变量、条件、处理程序、光标。DECLARE仅被用在BEGIN..END复合语句里,且必须在复合语句的开头,在其他任何语句之前。
1、存储程序中的变量:DECLARE局部变量、变量SET语句、SELECT...INTO语句
1.1 DECLARE局部变量语法: DECLARE var_name[,....] type [DEFAULT value]
这个语句给变量提供一个默认值,请包含一个default子句,值可以被指定为一个表达式,不需要为一个常数。
如果没有default子句,初始值为NULL.
局部变量的作用范围在它被声明的BEGIN...END块内。
1.2 变量SET语句语法:SET var_name = expr [, var_name = expr] ....
1.3 SELECT...INTO语句语法:SELECT col_name[,....] INTO var_name[,...] table_expr
这个select语法把选定的列直接存储到变量。
比如:select id,data into x,y from test.t1 limit 1
存储程序中的变量最终转化为一张图,如果这张表看懂了,基本不用看上面的文字,如图:

2、条件和处理程序:DECLARE 条件、DECLARE处理程序
2.1 DECLARE条件
DECLARE条件语法:DECLARE condition_name CONDITION FOR condition_value
Condition_value:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
这个语句指定需要特殊处理的条件,它将一个名字和指定的错误条件关联起来,随后会用在declare handler语句中。
2.2 DECLARE处理程序
DECLARE处理程序:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。
Handler_type包含:CONTINUE | EXIT | UNDO
——对于CONTINUE 处理程序,当前子程序的执行在执行处理程序语句之后继续,即遇到错误不处理,继续执行
——对于EXIT 处理程序,当前BEGIN...END符合语句的执行被终止,即遇到错误立即退出。
——UNDO处理程序类型语句还不被支持,即遇到错误立马回退。
Condition_value包含:SQLSTATE [VALUE] sqlstate_value
|condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。
——SQLWARNING是对所有以01开头的SQLSTATE代码的速记
——NOT FOUND 是对所有以02开头的SQLSTATE代码的速记
——SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记
参考博文: https://blog.csdn.net/mytt_10566/article/details/80555250
2.3 光标(游标)
光标:内存中的一块区域,存放的是select的结果。
光标在存储程序和函数内被支持。
光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。
声明光标:DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标,也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。
Select语句不能有into语句。
光标open语句:open cursor_name
这个语句打开先前声明的光标。
光标fetch语句:FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。
光标close语句:CLOSE cursor_name
这个语句关闭先前打开的光标,如果未被明确地关闭,关闭在它被声明的复合语句的末尾被关闭。
2.4 流程控制构造
IF条件语句:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
IF实现了一个基本的条件构造,如果search_condition求值为真,相应的SQL列表被执行。如果没有search_condition匹配,在ELSE子句里的语句列表被执行。Statement_list可以包括一个或多个语句。
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语句实现一个复杂的条件构造。如果search_condition求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行。
LOOP循环语句:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直循环被退出,退出通常伴随着一个LEAVE语句。
LEAVE退出语句:LEAVE label
这个语句被用来退出任何被标注的流程控制构造。它和BEGIN...END或循环一起被使用。
ITEARTE再次循环语句:ITEARTE label
ITEARTE 只可以出现在LOOP、REPEAT和WHILE语句内。ITERATE意思为:再次循环。
REPEAT 循环语句:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
REPEAT语句内的语句或语句群被重复,直至search_condition 为真。
REPEAT 语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。
WHILE 循环语句:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
WHILE语句内的语句或语句群被重复,直至search_condition 为真。
WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。
IF、CASE、LOOP、WHILE、ITERATE、LEAVE构造被完全实现。
这些构造可能每个包含要么一个单独语句,要么是使用BEGIN...END复合语句的一块语句。
anyway,流程控制构造说了那么多,其实最重要的就是包含条件语句、循环语句、退出语句。如果大家不想看那么多文字,只需要看懂下面的图,就能很清晰的了解流程控制构造的一些基本内容。
条件语句IF和CASE语句的流程图:

循环语句、退出语句示例图:

Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)的更多相关文章
- MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)
知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...
- shell(shell变量、条件表达式、流程控制)
本章内容: 变量 运算 if语句 for语句 while语句 break.continue 实例 shell变量 1.shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数 ...
- MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)
今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...
- MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引
本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...
- MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引
一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
- mysql存储过程变量的拼接
存储过程变量的拼接 有时候我们需要模糊查询,但是同时我们又要 在模糊查询的时候使用变量,我们又想在变量的后面拼接一个%去匹配模糊查询 那么就会用到 concat函数 示例如下: www. ...
- mysql 存储过程变量及循环的使用
1.用游标循环 BEGIN -- 定义变量 -- 定义done DECLARE done INT; -- 定义 ammeter_id_bl DECLARE ammeter_id_bl DOUBLE; ...
- MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复 ...
- [Shell]条件判断与流程控制:if, case, for, while, until
---------------------------------------------------------------------------------------------------- ...
随机推荐
- 1+X云计算 应用商城系统(gpmall)-遇到的问题以及解决办法
1+X云计算 应用商城系统(gpmall)-遇到的问题以及解决办法 问题1: 关于网站访问(打不开或者连接不上服务器的问题): 没有关闭selinux和防火墙,是访问不了网站 [root@mall ~ ...
- <摘自>飞:jxl简析2 [ http://www.emlog.net/fei ]
[<摘自>飞:jxl简析:http://www.emlog.net/fei] (二)应用 在进行实践前 , 我们需要对 excel 有一个大致的了解 ,excel 文件由一个工作簿 (Wo ...
- 在Linux深度系统deepin下安装docker
wget -qO- https://get.docker.com/ | sh wget -qO- https://get.docker.com/ | sh
- martini-拓扑映射
如何为一个新的分子创建拓扑文件? 这是martini应用的关键.http://jerkwin.github.io/2016/08/31/Martini%E5%B8%B8%E8%A7%81%E9%97% ...
- TCC事务原理
本文主要介绍TCC的原理,以及从代码的角度上分析如何实现的:不涉及具体使用示例.本文分析的是github中开源项目tcc-transaction的代码,地址为:https://github.com/c ...
- Xpath定位元素-一个例子
前几天在群里面解决的问题,记录下来和大家分享 需要定位这个股份制企业 方法: # 首先需要单击下拉框弹出企业性质的下拉选项:然后用过Xpath定位元素 driver.find.element_by_c ...
- Dubbo 初识SPI-Version2.7.5
1简介 SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在 ...
- 差点跪了!阿里3面真题:CAP和BASE理论了解么?可以结合实际案例说下不?
本文节选自我开源的 JavaGuide :https://github.com/Snailclimb/JavaGuide (Github标星92k+!一份涵盖大部分 Java 程序员所需要掌握的核心知 ...
- Guitar Pro 7 中文界面的介绍
用过Guitar Pro这款软件的小伙伴们都知道,Guitar Pro这款吉他软件因为是国外开发商研发的,所以软件最初都是英文版本,对于国内的的吉他爱好者来说,在软件使用上还是很不方便的.随着Guit ...
- 如何使Camtasia的抠像效果更真实自然
相信大家都知道录像编辑软件Camtasia的"移除颜色"可以抠像换背景,详细操作可以看小编的另一篇教程 <如何用Camtasia为微课换上一个好看的背景>.接下来,小编 ...