zoukankan      html  css  js  c++  java
  • 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语句的流程图:

     

      

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

     

     

     

     

  • 相关阅读:
    docker 容器与主机之间的数据copy
    vim 中如何快速注释和取消注释
    java查找字符中的某个内容并替换
    linux正则表达式
    数据流重定向与管道命令
    linux杂七杂八
    linux变量
    redis常用命令操作
    redis基本操作介绍
    redis数据结构
  • 原文地址:https://www.cnblogs.com/wendyw/p/11482273.html
Copyright © 2011-2022 走看看