什么是存储过程?

类似编程中的函数,可以将复杂sql语句存放到存储过程中,只需要调用存储过程就可以自动内部定义的sql语句。
常用的场景:

  1. 写了一个sql语句特别长,平时使用的场景又特别频繁。
  2. 批量插入数据,在做性能测试的时候需要准备一些测试数据。

定义存储过程

准备测试数据
demo.sql
image.png

查询所有的学生信息;

  1. select * from student;

基本定义

定义存储过程的基本语法:

  1. -- 定义语句的结束符号为 //
  2. delimiter //
  3. create procedure xxxxx()
  4. begin
  5. -- 要执行的sql语句
  6. end//
  7. -- 再次将结束符号恢复为 ;
  8. delimiter ;

将查询所有的的学生信息 定义成存储过程

  1. -- 定义语句的结束符号为 //
  2. delimiter //
  3. create procedure all_students()
  4. begin
  5. select * from student;
  6. end// -- 存储过程结束
  7. -- 再次将结束符号恢复为 ;
  8. delimiter ;

定义成功之后, 调用存储过程,使用 关键字 call 来进行调用。

  1. -- 调用存储过程
  2. call all_students();

定义有输入参数的存储过程

存储过程中也可以定义更新数据的操作,比如可以更新sid=1的age值

  1. update student set age=23 where sid=1;

修改值的时候每次都要写这条语句。定义成存储过程,通过调用存储过程,传入参数 id 以及对应 age 值,实现自动更新;

  1. -- 定义语句的结束符号为 //
  2. delimiter //
  3. create PROCEDURE update_age(IN id INT, IN newage INT)
  4. -- IN 表示传入的数据, 固定用法
  5. -- id 变量名
  6. -- INT 变量为数字类型
  7. BEGIN
  8. UPDATE student SET age = newage WHERE sid = id;
  9. end //
  10. -- 再次将结束符号恢复为 ;
  11. delimiter ;

主要说明:

  • IN 表示输入参数
  • id ,newage 这些为变量名。
  • INT 表示参数的类型

调用存储过程

  1. call all_students();
  2. CALL update_age(2,25);
  3. call all_students();

注意:存储过程的中如果有参数 按照参数的顺序传参即可。

定义有返回结果的存储过程

存储过程中的IN 表示传入的参数,
OUT 表示返回的参数;
查询班级最大的年龄;

  1. select max(age) from student;

将查询最大年龄的操作放入到存储过程中;

  1. -- 定义语句的结束符号为 //
  2. delimiter //
  3. create PROCEDURE max_age(OUT maxage INT)
  4. BEGIN
  5. SELECT max(age) into maxage from student; -- 将查询出来的最大年龄传给 maxage
  6. END //
  7. -- 再次将结束符号恢复为 ;
  8. delimiter ;
  9. call max_age(@MA); -- 调用存储过程,将maxage的值 @MA -- @固定写法
  10. SELECT @MA; -- 查询变量 @MA的值;

注意:

  1. into 不能少;
  2. @MA 中的@是固定用法;

作业:

  1. 定义存储过程。通过传入 name ,age 。修改对应name 的age ,也就是说根据姓名修改年龄;

比如传参 ‘小明’, 25, 将小明的年龄改为25岁。
参考:https://www.yuque.com/imhelloworld/bypiud/aud4wv#woSDl

  1. -- 定义语句的结束符号为 //
  2. delimiter //
  3. create PROCEDURE update_age_by_name(IN sname VARCHAR(255), IN newage INT)
  4. -- IN 表示传入的数据, 固定用法
  5. -- id 变量名
  6. -- INT 变量为数字类型
  7. BEGIN
  8. UPDATE student SET age = newage WHERE name = sname;
  9. end //
  10. -- 再次将结束符号恢复为 ;
  11. delimiter ;
  12. -- 调用存储过程
  13. CALL all_students();
  14. CALL update_age_by_name("小明",40);
  15. CALL all_students();
  1. 将班级中的最小年龄 使用存储过程返回出来。 ```sql — 定义语句的结束符号为 // delimiter // create PROCEDURE min_age(OUT minage INT) BEGIN SELECT min(age) into minage from student; — 将查询出来的最大年龄传给 maxage END //

— 再次将结束符号恢复为 ; delimiter ;

call min_age(@m); — 调用存储过程,将maxage的值 给 @MA — @固定写法 SELECT @m; — 查询变量 @MA的值; ```