MySQL存储过程是一组为了完成特定功能的SQL语句集合,被存储在数据库中,用户可以通过指定存储过程的名称和参数来调用执行它。存储过程能够减少网络传输、提升执行效率,也便于代码的复用和维护。

无参数存储过程的执行
如果存储过程没有定义任何参数,执行方式非常简单,直接使用call语句加存储过程名称即可,不需要加括号。
首先我们创建一个无参数的存储过程,用于查询当前数据库的所有用户表信息:
-- 创建无参数存储过程
DELIMITER //
CREATE PROCEDURE get_all_tables()
BEGIN
SELECT table_name, table_rows
FROM information_schema.TABLES
WHERE table_schema = DATABASE();
END //
DELIMITER ;
执行这个存储过程的代码如下:
-- 执行无参数存储过程 CALL get_all_tables;
带输入参数的存储过程执行
当存储过程定义了输入参数时,执行时需要在call语句后面的括号中传入对应类型的参数值,参数数量和顺序要和存储过程定义一致。
创建一个带输入参数的存储过程,根据传入的用户ID查询对应的用户信息:
-- 创建带输入参数的存储过程
DELIMITER //
CREATE PROCEDURE get_user_by_id(IN user_id INT)
BEGIN
SELECT user_id, user_name, user_email
FROM sys_user
WHERE user_id = user_id;
END //
DELIMITER ;
执行时传入具体的用户ID值:
-- 传入用户ID 1001 执行存储过程 CALL get_user_by_id(1001);
带输出参数的存储过程执行
如果存储过程包含输出参数,执行时需要使用用户变量来接收输出参数的值,执行完成后可以通过查询用户变量获取结果。
创建一个带输出参数的存储过程,统计指定状态的用户数量,并将结果通过输出参数返回:
-- 创建带输出参数的存储过程
DELIMITER //
CREATE PROCEDURE count_user_by_status(IN user_status INT, OUT user_count INT)
BEGIN
SELECT COUNT(*) INTO user_count
FROM sys_user
WHERE status = user_status;
END //
DELIMITER ;
执行这个存储过程的步骤如下:
-- 定义用户变量接收输出参数 SET @count_result = 0; -- 执行存储过程,传入状态值1,输出参数绑定用户变量 CALL count_user_by_status(1, @count_result); -- 查询用户变量获取结果 SELECT @count_result AS user_total;
带输入输出参数的存储过程执行
输入输出参数既可以作为输入传入值,也可以在执行后输出修改后的值,执行时同样需要绑定用户变量。
创建一个带输入输出参数的存储过程,实现传入的数值加1后返回:
-- 创建带输入输出参数的存储过程
DELIMITER //
CREATE PROCEDURE add_one(INOUT num INT)
BEGIN
SET num = num + 1;
END //
DELIMITER ;
执行方式如下:
-- 初始化用户变量 SET @input_num = 5; -- 执行存储过程 CALL add_one(@input_num); -- 查看修改后的结果 SELECT @input_num AS result;
执行存储过程的注意事项
- 执行存储过程需要有对应的
EXECUTE权限,如果没有权限会提示权限不足的错误。 - 传入的参数类型要和存储过程定义的参数类型兼容,否则可能出现类型转换错误或者结果不符合预期。
- 存储过程中如果包含事务操作,执行时需要注意事务的提交和回滚逻辑,避免数据不一致。
- 如果存储过程名称包含特殊字符或者和MySQL关键字重名,执行时需要使用反引号包裹存储过程名称。
查看存储过程执行状态
如果需要查看存储过程的执行状态或者定义信息,可以使用以下语句:
-- 查看当前数据库的存储过程列表 SHOW PROCEDURE STATUS WHERE Db = DATABASE(); -- 查看指定存储过程的定义 SHOW CREATE PROCEDURE get_user_by_id;