SQL存储过程是数据库中一组预先编译好的SQL语句集合,用户可以通过指定存储过程的名称和参数来执行对应的逻辑,避免重复编写相同的SQL代码,同时提升数据库操作的执行效率。

SQL存储过程基础语法
不同数据库的存储过程语法略有差异,以下以MySQL为例介绍基础编写结构。创建存储过程需要使用CREATE PROCEDURE语句,基础结构如下:
-- 如果存在同名存储过程则先删除
DROP PROCEDURE IF EXISTS proc_query_user;
-- 创建存储过程,接收两个输入参数
CREATE PROCEDURE proc_query_user(
IN user_id INT,
IN user_status TINYINT
)
BEGIN
-- 声明局部变量
DECLARE result_count INT DEFAULT 0;
-- 查询符合条件的用户数量
SELECT COUNT(*) INTO result_count FROM user_info WHERE id = user_id AND status = user_status;
-- 返回查询结果
SELECT result_count AS total_num;
END;参数类型说明
存储过程的参数分为三种类型,具体含义如下:
- IN:输入参数,调用方传入值给存储过程,过程内部可以修改该值,但修改后的值不会返回给调用方
- OUT:输出参数,存储过程内部可以给该参数赋值,最终值会返回给调用方
- INOUT:输入输出参数,调用方传入初始值,存储过程内部可以修改,修改后的值会返回给调用方
存储过程常用语法元素
变量声明与赋值
在存储过程内部可以使用DECLARE声明局部变量,变量作用域仅在当前的BEGIN...END块内,赋值可以通过SET语句或者直接查询赋值:
CREATE PROCEDURE proc_var_demo()
BEGIN
-- 声明变量并指定默认值
DECLARE var1 INT DEFAULT 10;
DECLARE var2 VARCHAR(50);
-- 使用SET赋值
SET var2 = 'test_value';
-- 查询赋值
SELECT username INTO var2 FROM user_info WHERE id = 1 LIMIT 1;
SELECT var1, var2;
END;流程控制语句
存储过程支持条件判断和循环逻辑,常用的语句包括IF、CASE、WHILE、REPEAT等:
-- 条件判断示例
CREATE PROCEDURE proc_check_score(
IN score INT,
OUT level VARCHAR(20)
)
BEGIN
IF score >= 90 THEN
SET level = '优秀';
ELSEIF score >= 60 THEN
SET level = '及格';
ELSE
SET level = '不及格';
END IF;
END;
-- 循环示例
CREATE PROCEDURE proc_insert_batch()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 10 DO
INSERT INTO test_table (content) VALUES (CONCAT('测试数据_', i));
SET i = i + 1;
END WHILE;
END;存储过程应用场景
存储过程适合在以下场景中使用:
- 需要频繁执行的复杂查询逻辑,封装后可以减少SQL语句的重复编写,同时预编译的特性可以提升执行速度
- 涉及多表关联、多步操作的业务场景,将整个业务流程封装在存储过程中,保证操作的原子性
- 需要数据库层面做权限控制的操作,给特定用户只开放存储过程的执行权限,避免直接操作表数据
- 减少应用服务器和数据库之间的网络传输,将复杂的逻辑在数据库端执行,只返回最终结果
存储过程开发注意事项
开发存储过程时需要注意以下问题:
- 避免在存储过程中编写过于复杂的逻辑,否则会导致维护困难,同时可能影响数据库性能
- 注意事务的使用,涉及数据修改的操作建议添加事务控制,出现异常时及时回滚
- 合理添加注释,说明存储过程的功能、参数含义和使用场景,方便后续维护
- 测试时先在小数据量环境验证逻辑正确性,再应用到生产环境,避免批量操作引发性能问题
存储过程调用方法
编写完成后可以通过CALL语句调用存储过程,带参数的调用示例如下:
-- 调用带输入参数的存储过程 CALL proc_query_user(1, 1); -- 调用带输出参数的存储过程 SET @score_level = ''; CALL proc_check_score(85, @score_level); SELECT @score_level;