一、调用存储过程 (CALL PROCEDURE)

在 MySQL 中,存储过程通常使用专门的 `CALL` 语句进行调用。
基本语法:
CALL sp_name([parameter[, ...]]);
`sp_name`:需要执行的存储过程名称。
`parameter`:传递给存储过程的参数,参数个数、顺序以及数据类型必须与定义存储过程时声明的内容保持一致。
重要特点:
即使该存储过程没有参数,调用时也必须保留括号 `()`,这是 MySQL 调用存储过程的标准写法。
存储过程不仅可以返回多个结果集,类似连续执行多个 `SELECT` 语句的效果,还能够通过 `OUT` / `INOUT` 参数返回额外的值。
示例:
下面演示如何调用一个无参存储过程 `ShowStuScore`,以及一个有参存储过程 `GetScoreByStu`。
调用无参过程,可能返回学生成绩列表
mysql> CALL ShowStuScore();
student_name student_score
Dany 90
Green 99
10 rows in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
调用有参过程,传入参数 'Green',返回该学生对应的成绩
mysql> CALL GetScoreByStu('Green');
student_score
99
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)
二、调用存储函数 (CALL FUNCTION)
MySQL 存储函数的调用方式,与常见的 MySQL 内置函数(例如 `NOW()`、`SUM()`)基本一致。
基本语法:
SELECT function_name([parameter[, ...]]);
`function_name`:要调用的存储函数名称。
`parameter`:传递给存储函数的参数。
重要特点:
存储函数只能返回一个单一值,因此经常出现在 `SELECT` 语句的字段列表中,也可以用于 `WHERE`、`ORDER BY` 等子句,或者将其结果赋值给变量。
存储函数不能直接返回结果集,同时也不支持使用 `OUT` / `INOUT` 参数。
示例:
调用存储函数 `func_student`,根据学生 ID 查询对应的学生姓名。
mysql> SELECT func_student(3);
func_student(3)
王五
1 row in set (0.10 sec)
此外,它也可以在查询语句中与其他字段配合使用
mysql> SELECT id, func_student(id) AS name FROM some_table;
三、存储过程 vs. 存储函数:调用方式对比
特性 存储过程 (PROCEDURE) 存储函数 (FUNCTION)
调用语句 `CALL` `proc_name();` `SELECT` `func_name();`
返回值 可返回多个结果集,或通过 `OUT` 参数返回值 必须返回一个标量值(单个值)
能否在SQL语句中嵌入 不能 可以(例如在 `SELECT`、`WHERE` 子句中使用)
主要用途 适合执行复杂业务逻辑操作(如增删改、事务处理) 适合进行计算并返回结果
