什么是存储过程?
类似编程中的函数,可以将复杂sql语句存放到存储过程中,只需要调用存储过程就可以自动内部定义的sql语句。
常用的场景:
- 写了一个sql语句特别长,平时使用的场景又特别频繁。
- 批量插入数据,在做性能测试的时候需要准备一些测试数据。
定义存储过程
准备测试数据
demo.sql
查询所有的学生信息;
select * from student;
基本定义
定义存储过程的基本语法:
-- 定义语句的结束符号为 //
delimiter //
create procedure xxxxx()
begin
-- 要执行的sql语句
end//
-- 再次将结束符号恢复为 ;
delimiter ;
将查询所有的的学生信息 定义成存储过程
-- 定义语句的结束符号为 //
delimiter //
create procedure all_students()
begin
select * from student;
end// -- 存储过程结束
-- 再次将结束符号恢复为 ;
delimiter ;
定义成功之后, 调用存储过程,使用 关键字 call 来进行调用。
-- 调用存储过程
call all_students();
定义有输入参数的存储过程
存储过程中也可以定义更新数据的操作,比如可以更新sid=1的age值
update student set age=23 where sid=1;
修改值的时候每次都要写这条语句。定义成存储过程,通过调用存储过程,传入参数 id 以及对应 age 值,实现自动更新;
-- 定义语句的结束符号为 //
delimiter //
create PROCEDURE update_age(IN id INT, IN newage INT)
-- IN 表示传入的数据, 固定用法
-- id 变量名
-- INT 变量为数字类型
BEGIN
UPDATE student SET age = newage WHERE sid = id;
end //
-- 再次将结束符号恢复为 ;
delimiter ;
主要说明:
- IN 表示输入参数
- id ,newage 这些为变量名。
- INT 表示参数的类型
调用存储过程
call all_students();
CALL update_age(2,25);
call all_students();
注意:存储过程的中如果有参数 按照参数的顺序传参即可。
定义有返回结果的存储过程
存储过程中的IN 表示传入的参数,
OUT 表示返回的参数;
查询班级最大的年龄;
select max(age) from student;
将查询最大年龄的操作放入到存储过程中;
-- 定义语句的结束符号为 //
delimiter //
create PROCEDURE max_age(OUT maxage INT)
BEGIN
SELECT max(age) into maxage from student; -- 将查询出来的最大年龄传给 maxage
END //
-- 再次将结束符号恢复为 ;
delimiter ;
call max_age(@MA); -- 调用存储过程,将maxage的值 给 @MA -- @固定写法
SELECT @MA; -- 查询变量 @MA的值;
注意:
- into 不能少;
- @MA 中的@是固定用法;
作业:
- 定义存储过程。通过传入 name ,age 。修改对应name 的age ,也就是说根据姓名修改年龄;
比如传参 ‘小明’, 25, 将小明的年龄改为25岁。
参考:https://www.yuque.com/imhelloworld/bypiud/aud4wv#woSDl
-- 定义语句的结束符号为 //
delimiter //
create PROCEDURE update_age_by_name(IN sname VARCHAR(255), IN newage INT)
-- IN 表示传入的数据, 固定用法
-- id 变量名
-- INT 变量为数字类型
BEGIN
UPDATE student SET age = newage WHERE name = sname;
end //
-- 再次将结束符号恢复为 ;
delimiter ;
-- 调用存储过程
CALL all_students();
CALL update_age_by_name("小明",40);
CALL all_students();
- 将班级中的最小年龄 使用存储过程返回出来。 ```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的值; ```