存储过程和函数类似于方法

一、创建、调用和删除存储过程

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 的原始数据如下图所示为空

  

sql server 存储过程入参区分大小写_SQL

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$

最终结果如下图所示:

  

sql server 存储过程入参区分大小写_原始数据_02

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 $

  

sql server 存储过程入参区分大小写_原始数据_03

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) $