存储函数是有返回值的存储过程,参数只能是 IN 类型,调用方式和普通函数一样,可以直接放在 SELECT 中。
CREATE FUNCTION 存储函数名称([参数列表])
RETURNS 类型 [characteristic ...]
BEGIN
RETURN ...;
END;
| characteristic | 含义 |
|---|
DETERMINISTIC | 相同的输入参数总是产生相同的结果 |
NO SQL | 不包含 SQL 语句 |
READS SQL DATA | 包含读取数据的语句,但不包含写入数据的语句 |
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);
| 对比项 | 存储过程 | 存储函数 |
|---|
| 返回值 | 通过 OUT / INOUT 参数返回,可多个 | RETURN 返回单个值 |
| 参数类型 | IN / OUT / INOUT | 只能是 IN |
| 调用方式 | CALL 名称(...) | SELECT 名称(...),可嵌入表达式 |
开启二进制日志时,若创建函数没有声明 DETERMINISTIC、NO SQL 或 READS SQL DATA,可能报错(错误码 1418)。
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);
| 要做什么 | 用什么 |
|---|
需要在 SELECT 中计算 | 存储函数(参数只能 IN) |
| 需要多个返回值 | 改用 存储过程 的 OUT 参数 |