数据库_存储过程
一、存储过程
-
存储过程是一组预先编译好的 SQL 语句集合,存放在数据库服务器端,可以包含变量、if-else、循环等逻辑,使用CALL调用执行。
-
优点
- 创建完成后可反复调用,不需要重复编写复杂 SQL 语句。
- 支持输入输出参数实现变量传递,包含 IN、OUT、INOUT 三种参数。
- 可以加入控制语句(如 IF、循环),增强 SQL 的功能与灵活性。
- 减少开发人员工作量,逻辑封装复用。
- 一定程度防止 SQL 注入。
- 可以用来批量造测试数据(重点)。
精简:存储过程创建后能够反复调用;支持 IN、OUT、INOUT 参数;可以使用 IF、循环等控制语句,增强 SQL 灵活性;减少开发工作量;能够一定程度防范 SQL 注入;还可以批量生成测试数据。
- 缺点
- 调试困难,排错不方便
- 业务逻辑写在数据库,数据库压力变大
- 可移植性差:MySQL 存储过程不能直接在 Oracle 运行
- 维护麻烦,修改需要操作数据库
二、存储过程的格式
-
创建存储过程:
-- 修改结束符,防止;提前终止存储过程定义 DELIMITER // drop procedure if exists 存储过程; CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 类型) BEGIN -- 这里写SQL语句、if else、变量等逻辑 END // -
查看已创建的存储过程:
show create procedure 存储过程 -
查看所有的存储过程:
show procedure status -
删除存储过程:
drop procedure 存储过程 -
判断是否存在新建名的存储,存在则删除,这条语句增强健壮性:
drop procedure if exists 存储过程 -
调用:
call 存储过程()
三、存储过程参数
- in(输入参数)【最常用】
- 作用:把外部的值传入存储过程的内部
- 特点:参数在存储过程内部可以修改,但修改不会影响外面的变量
- 语法:in 参数 int
- 使用场景:调用时传条件
- 案例:
CREATE PROCEDURE proc_test(IN num INT) BEGIN SELECT num; END; CALL proc_test(10);
- out(输出参数)
- 作用:存储过程内部把值传给外部
- 特点:调用传入的值会被清空,只能向外输出
- 语法:out 参数 int
- 注意:调用时必须传变量
call 存储过程(@参数) - 案例:
CREATE PROCEDURE proc_test(OUT res INT) BEGIN SET res = 99; END; CALL proc_test(@res); SELECT @res; - select @res:显示变量值
注意
用户变量:
set @变量名:=值|set @变量名=值|select @变量名:=值- 通过查询结果为变量值:
select 字段名 into 变量名 from 表名 where 条件- declare 声明变量【eg:
declare i int default 0;】
- inout(输入输出参数)
- 作用:既能传值进去,内部修改后又可以传回外面
- 语法:inout 参数 int
- 案例:
CREATE PROCEDURE proc_test(INOUT val INT) BEGIN SET val = val + 10; END; SET @v=5; CALL proc_test(@v); SELECT @v; -- 结果15
四、存储过程造数据
场景:写存储过程循环插入大量测试数据,造数据。用到:循环、变量、IN 参数、INSERT
- 核心知识点
DECLARE i INT DEFAULT 1:声明局部变量,初始值 1WHILE 条件 DO ... END WHILE;while 循环(还有 REPEAT、LOOP 三种循环)RAND():0~1 随机小数;FLOOR(RAND()*100):生成 0~99 随机整数CONCAT('学生',i):拼接字符串,生成学生姓名*
- 循环while【⭐️】:先判断条件,满足才执行(先判断后执行)
- 插入固定数据:创建无参存储过程,直接调用;
- 通过传入值进行插入数据
- 插入数据,将表中已存在的数据进行统计,在已有的基础上添加数据
- 声明一个变量默认值为表现有数据,将参数与该变量比较,判断是否插入数据
- 插入数据,每次新建表,重新插入数据
-
循环repeat:先执行一次,再判断条件;满足退出(先执行后判断)
-
循环LOOP:死循环,靠LEAVE退出
五、if语句
- if单分:
if 条件 then sql语句 else sql语句 end if;
注意:一个if对应一个end if
2.if多分支:if 条件 then sql语句 else if 条件 then else if 条件 then sql语句 else sql语句 end if;end if;end if;end if;

浙公网安备 33010602011771号