0
点赞
收藏
分享

微信扫一扫

MySQL高级应用——存储过程和函数

一、存储过程和函数

  create procedure用来创建存储过程, create function用来创建函数

  1、知识点概述

     函数与存储过程最大的区别就是函数调用有返回值,调用存储过程用call语句,而调用函数就直接引用函数名+参数即可

  • Definer和sql security子句指定安全环境
  • Definder是MySQL的特殊的访问控制手段,当数据库当前没有这个用户权限时,执行存储过程可能会报错
  • sql secuirty的值决定了调用存储过程的方式,取值 :definer(默认)或者invoker
  • definer:在执行存储过程前验证definer对应的用户如:cdq@127.0.0.1是否存在,以及是否具有执行存储过程的权限,若没有则报错
  • invoker:在执行存储过程时判断inovker即调用该存储过程的用户是否有相应权限, 若没有则报错

  • IN,OUT,INOUT三个参数前的关键词只适用于存储过程,对函数而言所有的参数默认都是输入参数
  • IN输入参数用于把数值传入到存储过程中;
  • OUT输出参数将数值传递到调用者,初始值是NULL;
  • INOUT输入输出参数把数据传入到存储过程,在存储过程中修改之后再传递到调用者
  • Delimiter命令是改变语句的结束符, MySQL默认的结束符为;号,由于procedure和function中的;号并不代表创建的结束,所以要替换成另外的结束符以便表示创建的结束
  • Rontine_body子句可以包含一个简单的SQL语句,也可以包含多个SQL语句, 通过begin…end将这多个SQL语句包含在一起
  • MySQL存储过程和函数中也可以包含类似create和drop等DDL语句
  • Comment子句用来写入对存储过程和函数的注释
  • Language子句用来表示此存储过程和函数的创建语言
  • 存储过程和函数被标注为deterministic表明当输入相同的参数是会返回相同的结果,反之如果是not deterministic则表示相同参数不会是相同结果,默认是not deterministic

  2、常用语句

  • Drop procedure/function语句用来删除指定名称的存储过程或函数
  • If exists关键词用来避免在删除一个本身不存在的存储过程或函数时, MySQL返回错误
  • Begin…end复合语句通常出现在存储过程、函数和触发器中,其中可以包含一个或多个语句,每个语句用;号分开
  • 标签语句 标签label可以加在begin…end语句以及loop, repeat和while语句
  • 语句中通过iterate和leave来控制流程, iterate表示返回指定标签位置, leave表示跳出标签
  • Declare语句 通常用来声明本地变量、游标、条件或者handler
  • Declare语句只允许出现在begin … end语句中而且必须出现在第一行
  • Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
  • 存储过程中的变量
  • 本地变量可以通过declare语句进行声明
  • 声明后的变量可以通过select … into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch … into var_list赋值
  • 通过declare声明变量方法
  • 使用default指定变量的默认值,如果没有指定默认值则初始值为NULL
  • Type指明该变量的数据类型
  • 声明的变量作用范围为被声明的begin … end语句块之间
  • 声明的变量和被引用的数据表中的字段名要区分开来
  • 流程控制语句

  MySQL支持if,case,iterate,leave,loop,while,repeat语句作为存储过程和函数中的流程控制语句,另外return语句也是函数中的特定流程控制语句

  • Case语句在存储过程或函数中表明了复杂的条件选择语句
  • 第一个语句中case_value与后面各句的when_value依次做相等的对比, 如果碰到相等的,则执行对应的后面的statement_list,否则接着对比,如果都没有匹配,则执行else后面的statement_list
  • 第二个语句中当search_condition满足true/1的结果时,则执行对应的statement_list,否则执行else对应的statement_list
  • Statement_list可以包含一个或多个SQL语句
  • IF语句在存储过程或函数中表明了基础的条件选择语句
  • IF语句中如果search_condition满足true/1的条件,则执行对应的statement_list,否则再判断elseif中的search_condition是否满足true/1的条件,如果都不满足则执行else中的statement_list语句
  • Statement_list中可以包含一个或多个SQL语句
  • Iterate语句仅出现在loop,repeat,while循环语句中,其含义表示重新开始此循环
  • Leave语句表明退出指定标签的流程控制语句块
  • 通常会用在begin…end,以及loop,repeat,while的循环语句中
  • Loop语句是存储过程或函数中表达循环执行的一种方式
  • 其中的statement_list可以包含一个或多个SQL语句


  • repeat语句是存储过程或函数中表达循环执行的一种方式
  • Repeat语句中statement_list一直重复执行直到search_condition条件满足
  • Statement_list可以包含一个或多个SQL语句


  • while语句是存储过程或函数中表达循环执行的一种方式
  • 当search_condition返回为true时,则循环执行statement_list中的语句,直到 search_condition的结果返回为false
  • Statement_list中可以包含一个或多个SQL语句
  • Return语句用在函数中,用来终结函数的执行并将指定值返回给调用
  • 在函数中必须要有至少一个return语句,当有多个return语句时则表明函数有多种退出的方式


  3、常用语句

  • cursor游标
  • Cursor游标用来声明一个数据集
  • 游标的声明必须在变量和条件声明之后,在handler声明之前

  • Cursor close语句用来关闭之前打开的游标
  • 如果关闭一个未打开的游标,则MySQL会报错
  • 如果在存储过程和函数中未使用此语句关闭已经打开的游标,则游标会在声明的begin…end语句块执行完之后自动关闭
  • Cursor declare语句用来声明一个游标和指定游标对应的数据集合,通常数据集合是一个select语句
  • Cursor fetch语句用来获取游标指定数据集的下一行数据并将各个字段值赋予后面的变量
  • 数据集中的字段需要和INTO语句中定义的变量一一对应
  • 数据集中的数据都fetch完之后,则返回NOT FOUND
  • Open cursor语句用来打开一个之前已经声明好的游标
  • Declare condition语句命名特定的错误条件,而该特定错误可以在declare…handler中指定处理方法
  • Declare handler语句用来声明一个handler来处理一个或多个特殊条件,当其中的某个条件满足时则触发其中的statement语句执行
  • Statement可以是一个简单SQL语句,也可以是begin…end组成的多个语句

  • Handler_action子句声明当执行完statement语句之后应该怎么办
  • Continue代表继续执行该存储过程或函数
  • Exit代表退出声明此handler的begin…end语句块
  • Undo参数已经不支持

  • Condition_value的值有以下几种:
  • Mysql_err_code表示MySQL error code的整数
  • SQLSTATE sqlstate_value表示MySQL中用5位字符串表达的语句状态
  • Condition_name表示之前在declare…condition语句中声明的名字
  • SQLWARNING表示所有的警告信息,即SQLSTATE中01打头的所有错误
  • NOT FOUND表示查完或者查不到数据,即SQLSTATE中02打头的所有错误
  • SQLEXCEPTION表示所有的错误信息

 


举报

相关推荐

0 条评论