目录
一、存储过程和函数概述
存储过程和函数具有以下优点:
存储过程和函数也存在一定的缺陷:
二、创建并调用存储过程和函数
1.创建存储过程
创建存储过程使用SQL语句CREATE PROCEDURE来实现,其语法形式如下:
2.创建存储函数
创建存储函数使用SQL语句CREATE FUNCTION来实现,其语法形式如下:
3.调用存储过程和函数
存储过程必须使用关键字CALL调用,而存储函数与MySQL内置函数的调用相同,使用关键字SELECT。
1.调用存储过程
通常使用关键字CALL调用存储过程,其语法形式如下:
其中的parameter表示变量名,存储过程的返回值将赋予该变量。
2.调用存储函数
通常使用关键字SELECT调用存储函数,其语法形式如下:
三、关于存储过程和函数的表达式
1.变量
变量是表达式中最基本的元素,可用于存储临时数据。
1.变量的分类
2.在存储过程和函数中应用变量
(1)定义变量
在存储过程中使用DECLARE语句定义局部变量,其语法形式如下:
上述语句中,var_name为局部变量名称,type为变量的数据类型,DEFUALT value是为变量指定的默认值。如果没有DEFAULT value,初始值为NULL。
注:变量的定义必须在复合语句开头,并且在任何其他语句前面。也就是说,DECLARE语句在存储过程和函数中使用时,必须出现在BEGIN...END语句块的最前面,并且变量名不区分大小写。可以一次声明多个相同类型的变量。
(2)为变量赋值
定义变量之后,可以使用SET关键字为变量赋值,语法形式如下:
变量值可以为常量或者表达式。
另外,也可以使用SELECT...INTO...查询语句将查询结果赋给变量,这要求查询结果必须只有一行,具体语法形式如下:
Col_name为字段名,var_name为变量名。
2.定义条件和处理程序
1.定义条件
在MySQL中定义条件使用DECLARE...CONDITION语句,其语法形式如下:
上述语句中,condition_name表示条件名。Condition_type表示条件的类型,其可取值及其意义如下:
注:数值类型的错误代码不要使用0,因为0表示成功而不是错误;字符串类型的错误代码不要使用‘00’,因为‘00’表示成功而不是错误。
2.定义处理程序
在定义条件之后,可以使用DECLARE...HANDLER语句定义处理程序,语法形式如下:
下面简单介绍上述语句中各组成部分及其意义。
(1)handler_type为异常处理方式,可取值及其意义如下:
(2)condition_value表示错误值,可取值及其意义如下:
(3)statement为程序语句段,表示在遇到定义的异常条件时,需要执行的存储过程或函数。
定义处理程序有以下6中方法:
3.游标的使用
在存储过程和函数中,当查询语句返回多条记录时,可以使用游标对结果集进行逐条读取。
1.定义游标
在MySQL中,使用DECLARE关键字来定义游标,其语法形式如下:
上述语句中,cursor_name表示游标名,select_statement表示SELECT语句,返回一个用于创建游标的结果集。
2.打开游标
打开游标的关键字为OPEN,其语法形式如下:
注:在打开一个游标时,游标并不指向第一条记录,而是指向第一条记录的前边。
3.使用游标
使用游标的关键字是FETCH,其语法形式如下:
上述语句的作用是将定义游标cursor_name时查询出的数据赋予变量var_name。
4.关闭游标
关闭游标的关键字为CLOSE,其语法形式如下:
4.流程控制的使用
1.IF语句
IF实现条件判断,语句中可以包含多个判断条件,系统会根据条件的结果是否为TRUE执行相应的操作,语法形式如下:
上述语句中,search_condition为判断条件,statement_list为相应操作,如果所有判断条件均不为TRUE,则执行ELSE子句中的操作。
2.CASE语句
CASE语句可以实现比IF语句更复杂的条件操作,该语句有两种使用形式。
第1种语法形式如下:
上述语句中,case_expr表示判断条件的表达式,将此表达式与每个WHEN子句中的when_value值进行比较,直到与其中一个相等,此时,执行相应THEN子句中的statement_list。如果表达式与所有when_value值都不相等,则执行ELSE子句中的statement_list。
第2种语法形式如下:
上述语句中,系统会对每个WHEN子句中的search_condition表达式进行判断,直到某个search_condition表达式为TRUE,此时将执行其对应的THEN子句中的statement_list。如果所有search_condition表达式的值都不为TRUE,则执行ELSE子句中的statement_list。
3.LOOP语句和LEAVE语句
LOOP语句可以实现简单的循环,使得系统能够重复执行循环结构内的语句列表。该语句列表由一条或多条语句组成,每条语句使用(;)隔开。语法形式如下:
上述语句中,loop_list表示LOOP语句的标注名称(可以省略),statement_list表示需要循环执行的SQL语句。
如果不在statement_list中增加退出循环的语句,LOOP语句可以实现简单的死循环。使用LEAVE语句可以退出循环。语法形式如下:
其中,label参数表示循环的标注名。
4.REPEAT语句
REPEAT语句可以实现一个带条件判断的循环结构。语法形式如下:
repeat_label表示REPEAT语句的标注名称(可以省略),每次SQL语句statement_list执行完毕后,会对条件search_condition进行判断,如果结果为TRUE,循环结束,否则继续执行循环中的语句。
5.WHILE语句
WHILE语句同样可以实现一个带条件判断的循环结构,但与REPEAT语句不同的是,WHILE语句会先对条件进行判断,如果为TRUE,才会执行需要循环的操作,否则终止循环,语法形式如下:
上述语句中,while_label为WHILE语句的标注名称,search_condition为判断条件,statement_list为需要循环的操作。
6.ITERATE语句
ITERATE语句只可以出现在LOOP语句、REPEAT语句和WHILE语句中,意义为再次执行循环,语法形式如下:
上述语句中,label表示循环的标志。
四、查看存储过程和函数
1.查看存储过程和函数的状态
使用SHOW STATUS语句可以查看存储过程和函数的状态。基本语法形式如下:
PROCEDURE或FUNCTION指定查看的是存储过程还是函数,LIKE语句指定存储过程和函数的名称。
主要参数及其意义如下:
2.查看存储过程和函数的定义
使用SHOW CREATE语句可以查看存储过程和函数的定义语句,语法形式如下:
PROCEDURE或FUNCTION指定查看的是存储过程还是函数,pf_name指定存储过程或函数名。
主要参数及其意义如下:
3.查看存储过程和函数的信息
在MySQL中,存储过程和函数的信息存储在系统数据库information_schema中的routines表中,查看存储过程和函数详细信息的语法形式如下:
上述语句中,ROUTINE_NAME指定存储过程或函数名,如果有存储过程和存储函数名相同,还可以使用ROUTINE_TYPE指定类型。
主要参数及其意义如下:
五、修改和删除存储过程和函数
1.修改存储过程和函数
在MySQL中,使用ALTER关键字可以修改存储过程和函数,基本语法形式如下:
上述语句中,pf_name表示存储过程或函数名。characteristic表示存储过程和函数的特性,其可取值有CONTAINS SQL,NO SQL,READS SQL DATA,MODIFIES SQL DATA,SQL SECURITY{DEFINER|INVOKER},各值得意义与创建存储过程和函数时相同。
注:修改存储过程使用ALTER PROCEDURE语句,修改存储函数使用ALTER FUNCTION语句,这两个语句结构相同,参数也一样。并且它们与创建存储过程和函数得语句中的参数也基本一样。
不能使用关键字ALTER更改存储过程的参数或子程序,如果需要修改,必须删除存储过程后再重新创建。
2.删除存储过程和函数
在MySQL中,删除存储过程和函数可以使用DROP语句,语法形式如下:
pf_name为要删除的存储过程或函数名。使用IF EXISTS可以在执行删除操作时,先判断存储过程和函数是否存在,避免系统报错。