一 存储函数的概述
在MySQL中,存在一种与存储过程十分相似的过程式数据库对象——存储函数。它与存储过程一样,都是由SQL语句和过程式语句组成的代码片段,并且可以被应用程序和其他SQL语句调用。
二、存储函数和存储过程的区别
(1)存储函数不能拥有输出参数。存储过程拥有输出参数。
(2)可以直接对存储函数调用(select),不需要使用CALL语句,存储过程调用需要。
(3)存储函数中必须包含RETURN语句,此语句不允许出现在存储过程中。
(4)存储过程和存储函数都是存储在服务器端的SQL语句的集合,要使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现,存储过程是通过CALL语句来调用的。而存储函数的使用方法与MySQL内部函数的使用方法是一样的,区别在于,存储函数是用户自己定义的,而内部函数是MySQL的开发者定义的。
三、创建存储函数语法
Delimiter $$
Create function 存储函数名称(参数名 数据类型,...)
Returns 数据类型
Begin
存储函数体
End
$$
注意:(1)Returns 数据类型---用于声明存储函数返回值的数据类型
(2)存储函数体
-
- 局部变量
- Set 语句
- Select...into语句
- 流程控制语句
- 游标
- return value---存储函数的返回值
说明:在return value语句中包含select语句时,select语句的返回结果只能是一行且只能是一列值(即单值);
例如:创建存储函数语法
Delimiter $$
Create function 存储函数名称(参数名 数据类型,...)
Returns 数据类型
Begin
If 条件 then
Return (返回的值);
Elseif 条件 then
Return (返回的值);
...
Else Return (返回的值);
End if;
End
$$
例1:在数据库db_school中,创建一个存储函数,要求该函数根据给定的学号返回学生的姓名;
Delimiter $$
Create function f_name(sno int)
Returns char(20)
Begin
Return (select studentname from tb_student where studentno=sno);
End$$
Select f_name(2013110101)$$
或
Delimiter $$
Create function f_name1(sno int)
Returns char(20)
Begin
Declare sname char(20);
Select studentname into sname from tb_student where studentno=sno;
Return sname;
End$$
Select f_name1(2013110101)$$
例2:在数据库db_school中,创建一个存储函数,要求该函数根据给定的学号返回学生的性别,如果数据库中没有给定的学号,则返回“没有该学生”;
Create function f_sex(sno int)
Returns char(20)
Begin
Declare ssex char(20);
Select sex into ssex from tb_student where studentno=sno;
If ssex is null then return (select '没有该学生');
Elseif ssex='男' then return (select '男');
Else return (select '女');
End if;
End$$
Select f_sex(2013110101)$$
四、调用存储函数
Select 存储函数名称(参数列表值);
例:Select f_sex(2013110101)$$
五、查看存储函数
(1)查看符合条件的存储函数或存储过程:
Show {function|procedure} status [like 'pattern'] \G
例:Show function status like 'f_%' \G
注意:like 'pattern'参数用来匹配存储过程或存储函数的名称
(2)查看某一个存储函数的详细结构
Show create function [数据库名.]存储函数名称 \G
例:Show create function f_sex \G
六、删除存储函数
Drop function 存储函数名称;
注意:同一数据库下,不能同时删除多个存储函数。
例:drop function f_name1;