最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法。本篇文章主要包括介绍了存储过程的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 存储过程(变量、定义条件、处理程序、光标、流程控制构造)的更多相关文章

  1. MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)

    知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...

  2. shell(shell变量、条件表达式、流程控制)

    本章内容: 变量 运算 if语句 for语句 while语句 break.continue 实例 shell变量 1.shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数 ...

  3. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  4. MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引

    本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...

  5. MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

    一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  6. mysql存储过程变量的拼接

    存储过程变量的拼接   有时候我们需要模糊查询,但是同时我们又要 在模糊查询的时候使用变量,我们又想在变量的后面拼接一个%去匹配模糊查询   那么就会用到 concat函数   示例如下:  www. ...

  7. mysql 存储过程变量及循环的使用

    1.用游标循环 BEGIN -- 定义变量 -- 定义done DECLARE done INT; -- 定义 ammeter_id_bl DECLARE ammeter_id_bl DOUBLE; ...

  8. MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引

    视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复 ...

  9. [Shell]条件判断与流程控制:if, case, for, while, until

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. GMP-C/C++(大数库)使用方法

    The GNU Multiple Precision Arithmetic Library(GNU 高精度算数库)是一个用于任意精度算术的免费库,可处理带符号整数,有理数和浮点数.除了运行GMP机器中 ...

  2. 154. Find Minimum in Rotated Sorted Array II(循环数组查找)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  3. linux系统中离线安装python3.7过程记录

    最近公司新弄来一台linux  redhat 4.4.7服务器,准备在上面离线安装python3.7,安装过程中出现一些问题,特此记录下来. 首先在python官网上下载了 Python-3.7.3. ...

  4. 《GNU_Makefile》第4章——makefile规则

    规则明确在什么情况下,使用什么方法,重构文件,该文件称为目标. make的唯一目的是重构终极目标.终极目标默认是第一个目标. 1. 2.规则语法 TARGETS : PREREQUISITES COM ...

  5. python any,call,init,下划线知识汇总

    python补充 any() [来自菜鸟教程] any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True. 元素 ...

  6. Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现

    0x00  漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...

  7. PHP 使用gd库给图片加图片水印,文字水印,并返回路径

    //图片水印 $mark_filename = './02.jpg'; //获取图片信息 $info = getimagesize($mark_filename); //获取图片的后缀 $type = ...

  8. Jmeter生成HTML测试报告

    jmeter轻便小巧,运行速度快,但是缺少直观的可视化测试报告,并且生成测试报告操作稍微有点麻烦. GUI界面没有生成测试报告的功能,只能使用命令行生成测试报告.这里需要提到一个jtl的文件,它是生成 ...

  9. Session 与 sql 会话,mysql 权限设置,mybatis 逆向工程

    Session 与 Sql 会话注意点: 通过 sqlSessionFactoty 工厂建立的与sql的会话,在进行相应的插入操作后,需要进行 commit 操作才会让数据库执行插入更新操作.如何主键 ...

  10. native关键字是干什么的?

    目录 1.怎么调用到native方法的呢? 2. java调用自定义native方法步骤 3.使用native的缺点 今天一不小心跟进Object的源码中,发现一个native关键字,一脸蒙蔽,怎么我 ...