460 字
2 分钟
MySQL07-存储函数
2023-06-05
2023-11-25

详细的描述了MySQL中的存储函数。

存储函数#

存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。

语法#

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS type [characteristic ...]
BEGIN
--SQL语句
RETURN ...;
END;
characteristic说明:
+ DETERMINISTIC:相同的输入参数总是产生相同的结果
+ NO SQL:不包含SQL语句。
+ READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。

样例#

-- 存储函数
-- 计算从1到n的累加
create function fun1(n int)
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;
select fun1(100);

注意当未添加 deterministic 会产生如下bug:

此例中,函数仅按输入整数做累加,相同输入能确定相同结果,因此声明 DETERMINISTIC 有明确依据。若启用了二进制日志,且函数创建者信任设置保持严格,创建函数时未声明确定性、无数据访问或只读数据等特征,可能被拒绝。这里讨论的是创建阶段的日志安全限制,并非所有环境中省略确定性声明都会出错。

运行结果:

此例中,函数从传入的 100 开始,每轮先累加再递减,直到参数不再为正,最后通过 RETURN total 返回总和。由一至一百的等差求和可得 5050,因此 SELECT fun1(100) 读取的是这一标量值;这与存储过程中直接执行查询返回结果集的写法不同。

注意#

存储函数必须要有返回值,而且参数只能是输入类型的参数,其过程实现完全可以被存储过程所代替。

因此存储函数的使用较少,这里仅做了解。