存储过程和函数类似于方法
一、创建、调用和删除存储过程
1、创建存储过程的语法:
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的SQL语句)
end
注意事项:
(1)、参数列表包含如下三部分:
- 参数模式:in 、out、inout
- 参数名
- 参数类型
如: IN stuname VARCHAR(20)
(2)、参数模式分析:
- in:该参数可以作为输入,即该参数需要调用方传入值
- out:该参数可以作为输出,即该参数可以作为返回值
- inout:该参数即可作为输入又可作为输出,也就是该参数既需要传入值,又可以返回值
(3)、如果存储过程体只有一句话,begin end 可以省略
(4)、存储过程体中的每条SQL语句结尾必须加分号
(5)、存储过程的结尾可以使用 delimiter 重新设置。如:delimiter 结束标记
2、调用存储过程的语法:
call 存储过程名(实参列表);
3、 删除存储过程
drop procedure 存储过程名; # 一次只能删除一个存储过程
# 如删除存储过程 myfu 的语句
DROP PROCEDURE myfu;
4、查看存储过程
show create procedure 存储过程名;
# 如查看存储过程 myfu06
show create procedure myfu06;
二、应用实例
表 stuinfo 的原始数据如下图所示为空
1、往表 stuinfo 中插入5条数据:
【注】:需要在cmd 窗口中来进行操作,在sqlyog中操作提示失败
# 创建存储过程
DELIMITER $ # 定义新的结束符号,系统默认的是分号。后面就需要使用自己新定义的符号来结束语句。
CREATE PROCEDURE myfu01( ) # 形参列表为空
BEGIN
INSERT INTO stuinfo(id,sname,money)
VALUES(1,'Kity02',2000),
(2,'Kity06',6000),
(3,'Kity03',3000),
(4,'Kity04',4000),
(5,'Kity05',5000);
END $ # end 后要使用前面定义的结束符
# 调用存储过程
CALL myfu()$ # 调用结束后有结束符
select * from stuinfo$
最终结果如下图所示:
2、创建带 in 模式参数的存储过程
- in可以省略,此时默认为 in 模式
- 由于上面已经定义了结束符,所以在此不需要再次定义结束符了
(1)、创建存储过程,实现根据A,查询对应的B的信息
create procedure myfu02(in tname varchar(20))
begin
select bo.*
from boys bo
right join beau be on bo.id=be.partId
where be.name=tname;
end $
call myfu02('A')$
(2)、创建存储过程,实现用户是否登陆成功的判断
create procedure myfu03(in username varchar(20),in passwd int)
begin
declare result in default 0;
select count(*) into result
from stu
where stu.username=username
and stu.password=passwd;
select if(result>0,'success','fail');
end $
call myfu03('Kity',888777) $
3、创建带 out 模式参数的存储过程
(1)、带一个out 模式的:根据 A 来查询其搭档的名字(A在一张表,其搭档在另一张表中)
# 创建存储方法
create procedure myfu04(in beName varchar(20),out boName varchar(20))
begin
select bo.boyName into boName
from boys bo
inner join beauty be on bo.id=be.boyfriend_id
where be.name=beName;
end $
# 调用存储方法
[set @resultName $] # 定义用户变量来接受存储方法返回的值,。可省略该定义,在下面直接使用
call myfu04('A',@resultName) $ A 为传入参数,
# 打印结果
select @resultName $
(2)、带多个 out 模式:根据 A 返回对应的搭档名和年龄
create procedure myfu05(in beName varchar(20),out boName varchar(20),out boAge int)
begin
select bo.boyName,bo.boyAge into boName,boAge
from boys bo
inner join beauty be on bo.id=be.boyfriend_id
where be.name=beName;
end $
call myfu05('A',@theName,@theAge) $
select @theName,@theAge $
4、创建带 inout 模式参数的存储过程
传入a 和 b 两个值,最终a 和 b都翻倍并返回
# 创建存储过程
DELIMITER $
CREATE PROCEDURE myfu06(INOUT a INT,INOUT b INT)
BEGIN
SET a:=2*a;
SET b:=2*b;
END $
# 调用存储过程
SET @re01:=2, @re02:=6 $
CALL myfu06(@re01,@re02)$
# 打印结果
SELECT @re01, @re02 $
5、创建存储过程实现传入一个日期,格式化成xx年xx月xx日的格式并返回
CREATE PROCEDURE tranDate(IN mydate DATETIME,OUT strDate VARCHAR(20))
BEGIN
SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
END $
CALL tranDate(NOW(),@str) $