存储过程和函数使用及比较

一、存储过程

1.1 什么是存储过程

存储过程是一组预先编译好的sql语句集合

1.2 为什么要用存储过程

  1. 简化操作
  2. 提高代码重用性
  3. 减少编译次数,减少和数据库服务器的连接次数,提高了效率

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 函数名;

三、存储过程与函数的比较

  1. 存储过程可以有0个或多个返回值,函数有且只有一个
比较 参数列表 调用 查看所有 查看某个
存储过程 参数模式,参数名,参数类型 call 存储过程名(参数列表) show procedure status; show create procedure 存储过程名;
函数 没有参数模式 select 函数名(参数列表) show function status; show create function 函数名;

猜你喜欢

转载自blog.csdn.net/qq_44209563/article/details/108248470