• 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语句的流程图:

     

      

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

     

     

     

     

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/wendyw/p/11482273.html
Copyright © 2020-2023  润新知