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

一、存储过程

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 函数名;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值