存储过程概念:
一组预编译好的sql语句集合,批处理语句。
- 提高代码的重用性
- 简化操作
- 减少编译次数并且减少和数据库服务器连接的次数,提高效率
存储过程的创建:
create procedure 存储过程名([参数模式] 参数名 参数类型)
begin
存储过程体
end
参数模式3种:
in: 作为输入,参数调用方需传入值
out:作为输出,参数可以作为返回值
inout: 既可作为输入也可以作为输出,参数调用方调用时传入值,又可以作为返回值
参数模式默认in
一个存储过程可以有多个输入,多个输出,多个输入输出参数
存储过程调用:
call 存储过程名称(参数列表);
关键字call
存储过程删除:
drop procedure [if exists] 存储过程名称;
存储过程只能一个个删除,不能批量删除
存储过程修改:
存储过程不能修改,若涉及到修改的,可以先删除,然后重建。
查看存储过程:
show create procedure 存储过程名称;
可以查看存储过程详细创建语句
示例一 空参列表
创建存储过程:
/*设置结束符$*/
delimiter $
/*如果存储过程存在则删除*/
drop procedure if exists procl;
/*创建存储过程procl*/
create procedure procl()
begin
insert into t_user values (1,30,'路人甲');
inset into t_user values (2,50,'刘德华');
end $
/*将结束符置为;*/
delimiter ;
delimiter⽤来设置结束符,当mysql执⾏脚本的时候,遇到结束符的时候,会把
结束符前⾯的所有语句作为⼀个整体运⾏,存储过程中的脚本有多个sql,但是
需要作为⼀个整体运⾏,所以此处⽤到了delimiter。
调用存储过程:
call procl();
验证:select * from t_user;
示例二 参数in
创建存储过程:
delimter $
drop procedure if exists proc2;
create procedure proc2(id int,age int, in name varchar(16))
begin
insert into t_user values (id,age,name);
end $
delimier ;
调用存储过程:
/*自定义变量*/
select @id:=3,@age:=56,@name='张学友';
call proce2(@id,@age,@name);
验证:select * from t_user;
示例三 参数out
创建存储过程:
/*如果存储过程存在则删除*/
DROP PROCEDURE IF EXISTS proc3;
/*设置结束符为$*/
DELIMITER $
/*创建存储过程proc3*/
CREATE PROCEDURE proc3(id int,age int,in name varchar(16),out
user_count int,out max_id INT)
BEGIN
INSERT INTO t_user VALUES (id,age,name);
/*查询出t_user表的记录,放⼊user_count中,max_id⽤来存储t_user中最⼩的id*/
SELECT COUNT(*),max(id) into user_count,max_id from t_user;
END $
/*将结束符置为;*/
DELIMITER ;
proc3中前2个参数,没有指定参数模式,默认为in。
调⽤存储过程:
/*创建了3个⾃定义变量*/
SELECT @id:=4,@age:=55,@name:='郭富城';
/*调⽤存储过程*/
CALL proc3(@id,@age,@name,@user_count,@max_id);
select @user_count,@max_id;
示例4:带inout参数的存储过程
创建存储过程:
/*如果存储过程存在则删除*/
DROP PROCEDURE IF EXISTS proc4;
/*设置结束符为$*/
DELIMITER $
/*创建存储过程proc4*/
CREATE PROCEDURE proc4(INOUT a int,INOUT b int)
BEGIN
SET a = a*2;
select b*2 into b;
END $
/*将结束符置为;*/
DELIMITER ;
调⽤存储过程:
/*创建了2个⾃定义变量*/
set @a=10,@b:=20;
/*调⽤存储过程*/
CALL proc4(@a,@b);
验证效果:
mysql> SELECT @a,@b;
上⾯的两个⾃定义变量@a、@b作为⼊参,然后在存储过程内部进⾏了修改,又
作为了返回值