一、存储过程
1.1 什么是存储过程
存储过程是一组预先编译好的sql语句集合
1.2 为什么要用存储过程
- 简化操作
- 提高代码重用性
- 减少编译次数,减少和数据库服务器的连接次数,提高了效率
1.3 如何使用
1.3.1 创建
- 语法
create procedure 存储过程名(
参数模式 参数名 参数类型
)
begin
存储过程体(即一组sql语句)
end
调用
call 存储过程名(参数);
- 说明
参数模式有三种:
1. in :表示参数需传入值
2. out :表示参数是返回值
3. inout :表示参数既需要传入值,又是返回值
注意:当一个参数是返回值的时候,在存储过程体中必须要有赋值给该参数的语句
- 例子
空参
create procedure myp1()
BEGIN
insert into account2(name,balance) values('gg',100),('mm',200);
end
call myp1();# 调用存储过程
in模式
# 创建存储过程,根据女生名找到对应男生信息
create procedure myp2(
in beautyName varchar(20)
)
BEGIN
select be.name,bo.boyName
from beauty be
left join boys bo
on be.boyfriend_id=bo.id
where be.name=beautyName;
END
call myp2('赵敏‘);
out模式
# 一个out参数
#创建存储过程,根据女生名查询对应的男生名
create procedure myp3(in beautyName varchar(20),out bName varchar(20))
BEGIN
select bo.boyName into bName -->将结果赋值给局部变量bNme
from beauty be
left join boys bo
on be.boyfriend_id=bo.id
where be.name=beautyName;
END
call myp3('赵敏',@name); #使用一个用户变量来接收结果(out变量结果)
select @name; #查看接收的结果
# 多个out参数
#创建存储过程,根据女生名查询对应的男生名和cp值
create procedure myp4(in beautyName varchar(20),out bName varchar(20),out cp int)
BEGIN
select bo.boyName,bo.userCP into bName,cp -->分别赋值给不同的变量
from boys bo
right join beauty be
on be.boyfriend_id=bo.id
where be.name=beautyName;
end
call myp4('赵敏',@t1,@t2);
select @t1;
select @t2;
inout模式
# 创建存储过程,使输入参数翻倍
create procedure myp5(inout a int,inout b int)
BEGIN
set a=a*2; -->赋值
set b=b*2;
END
set @t3=5;
set @t4=6; #定义两个用户变量
#注意此处调用时,参数要使用变量,不能使用常数
#因为这两个参数既是输入,又是输出,前后的结果会不同,所以需要使用变量
call myp5(@t3,@t4);
select @t3;
select @t4;
- 总结
存储过程中的参数如果是out模式,那么在存储过程体当中,必须要有对该参数赋值的语句。
1.3.2 删除
drop procedure 存储过程名;
1.3.3 查看
- 查看有哪些存储过程
show procedure status;
- 查看指定存储过程的信息
show create procedure 存储过程名;
二、函数
2.1 创建
- 语法
create function 函数名(参数名 参数类型) returns 返回类型
BEGIN
函数体
END
调用
select 函数名(参数列表);
- 例子
无参
#返回员工的个数
create function myf1() returns int
BEGIN
declare c int default 0; -->定义一个变量,接收返回值(局部变量)
select count(*) into c -->给变量赋值
from employees;
return c; -->返回变量
END
调用
select myf1();
有参
#根据员工名返回工资
create function myf2(empName varchar(20)) returns double
BEGIN
set @sal=0; -->定义变量接收返回值(用户变量)
select salary into @sal -->赋值
from employees
where last_name=empName;
return @sal; -->返回变量
END
select myf2('kochhar');
注意:在定义变量来接收返回值的时候,使用局部变量或者用户变量都可以。
- 总结
函数中必须要有一个return语句,用来返回值。
2.2 删除
drop function 函数名;
2.3 查看
- 查看所有的函数
show function status;
- 查看指定的函数信息
show create function 函数名;
三、存储过程与函数的比较
- 存储过程可以有0个或多个返回值,函数有且只有一个。
比较 | 参数列表 | 调用 | 查看所有 | 查看某个 |
---|---|---|---|---|
存储过程 | 参数模式,参数名,参数类型 | call 存储过程名(参数列表) | show procedure status; | show create procedure 存储过程名; |
函数 | 没有参数模式 | select 函数名(参数列表) | show function status; | show create function 函数名; |