一、介绍
存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。
也就是说对于存储函数来说,我们要去定义一个存储函数,必须要指定返回值,而且它的参数列表中所有的参数必须是输入类型in类型的,不能是out类型,当然,不写也是in类型。
具体语法如下:
CREATE FUNCTION 存储函数名称 ([ 参数列表 ])
RETURNS type [characteristic ...] -- characteristic:可选参数,指代的是当前存储参数它的特性
BEGIN
-- SQL语句
RETURN ...;
END ;
characteristic说明:
- DETERMINISTIC:相同的输入参数总是产生相同的结果
- NO SQL :不包含 SQL 语句。
- READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。
二、案例
计算从1累加到n的值,n为传入的参数值。
create function fun1(n int) -- 参数类型可以不用写,因为默认就是in,而且这一块类型只能是in
returns int deterministic
begin
declare total int default 0;
while n>0 do
set total := total + n;
set n := n - 1;
end while;
return total;
end;
-- 调用fun1函数,并且将函数的返回值查询展示出来
select fun1(50);
在mysql8.0版本中binlog默认是开启的,一旦开启了,mysql就要求在定义存储函数时,需要指定 characteristic特性,否则就会报如下错误:
并且可以发现,存储过程显示的是p,而存储函数显示的是f
但是存储函数我们相对用的比较少一些,因为存储函数能做的事情,存储过程也能做到;而且存储函数还有一个弊端,它必须得有返回值。那么大家想,假如说我要去执行一段逻辑,而这段逻辑有返回值,也是可以使用存储过程写的,因为存储过程我们可以指定参数的类型为out,就可以接收存储过程执行的结果。
所以能够使用存储函数的地方,也可以使用存储过程替代。