数据库_存储过程

一、存储过程

  1. 存储过程是一组预先编译好的 SQL 语句集合,存放在数据库服务器端,可以包含变量、if-else、循环等逻辑,使用CALL调用执行。

  2. 优点

  • 创建完成后可反复调用,不需要重复编写复杂 SQL 语句。
  • 支持输入输出参数实现变量传递,包含 IN、OUT、INOUT 三种参数。
  • 可以加入控制语句(如 IF、循环),增强 SQL 的功能与灵活性。
  • 减少开发人员工作量,逻辑封装复用。
  • 一定程度防止 SQL 注入。
  • 可以用来批量造测试数据(重点)。

精简:存储过程创建后能够反复调用;支持 IN、OUT、INOUT 参数;可以使用 IF、循环等控制语句,增强 SQL 灵活性;减少开发工作量;能够一定程度防范 SQL 注入;还可以批量生成测试数据。

  1. 缺点
  • 调试困难,排错不方便
  • 业务逻辑写在数据库,数据库压力变大
  • 可移植性差:MySQL 存储过程不能直接在 Oracle 运行
  • 维护麻烦,修改需要操作数据库

二、存储过程的格式

  1. 创建存储过程: -- 修改结束符,防止;提前终止存储过程定义 DELIMITER // drop procedure if exists 存储过程; CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 类型) BEGIN -- 这里写SQL语句、if else、变量等逻辑 END //

  2. 查看已创建的存储过程:show create procedure 存储过程

  3. 查看所有的存储过程:show procedure status

  4. 删除存储过程:drop procedure 存储过程

  5. 判断是否存在新建名的存储,存在则删除,这条语句增强健壮性:drop procedure if exists 存储过程

  6. 调用:call 存储过程()

三、存储过程参数

  1. in(输入参数)【最常用】
  • 作用:把外部的值传入存储过程的内部
  • 特点:参数在存储过程内部可以修改,但修改不会影响外面的变量
  • 语法:in 参数 int
  • 使用场景:调用时传条件
  • 案例:CREATE PROCEDURE proc_test(IN num INT) BEGIN SELECT num; END; CALL proc_test(10);
  1. 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;】
  1. 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

  1. 核心知识点
  • DECLARE i INT DEFAULT 1:声明局部变量,初始值 1
  • WHILE 条件 DO ... END WHILE; while 循环(还有 REPEAT、LOOP 三种循环)
  • RAND():0~1 随机小数;FLOOR(RAND()*100):生成 0~99 随机整数
  • CONCAT('学生',i):拼接字符串,生成学生姓名*
  1. 循环while【⭐️】:先判断条件,满足才执行(先判断后执行)
  • 插入固定数据:创建无参存储过程,直接调用;
  • 通过传入值进行插入数据
  • 插入数据,将表中已存在的数据进行统计,在已有的基础上添加数据
    • 声明一个变量默认值为表现有数据,将参数与该变量比较,判断是否插入数据
  • 插入数据,每次新建表,重新插入数据
  1. 循环repeat:先执行一次,再判断条件;满足退出(先执行后判断)

  2. 循环LOOP:死循环,靠LEAVE退出

五、if语句

  1. 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;

posted @ 2026-09-10 15:36  一只鹿吖  阅读(17)  评论(0)    收藏  举报