mysql存储过程详解01

介绍

存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

  • 封装,复用。可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。
  • 可以接收参数,也可以返回数据。 再存储过程中,可以传递参数,也可以接收返回值。
  • 减少网络交互,效率提升 。 如果涉及到多条SQL,每执行一次都是一次网络传输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。

基本语法

1). 创建

CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) 
BEGIN
    -- SQL语句 
END ;

2). 调用

CALL 名称 ([ 参数 ]);

3). 查看

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; 
-- 查询指 定数据库的存储过程及状态信息 
SHOW CREATE PROCEDURE 存储过程名称 ; 
-- 查询某个存储过程的定义

4). 删除

DROP PROCEDURE [ IF EXISTS ] 存储过程名称;

演示示例:

-- 存储过程基本语法 
-- 创建 
create procedure p1() 
begin
    select count(*) from student; 
end; 

-- 调用 
call p1(); 

-- 查看 
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'itcast'; 

show create procedure p1; 

-- 删除 
drop procedure if exists p1;

变量

在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。

系统变量

系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。(用得少,不展开介绍)

用户定义变量

用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。

演示示例:

-- 赋值 
set @myname = 'tyson'; 
set @myage := 24; 
set @mygender := '男',@myhobby := 'java'; 
select @mycolor := 'red'; 
select count(*) into @mycount from tb_user; 

-- 使用 
select @myname,@myage,@mygender,@myhobby; 
select @mycolor , @mycount;

局部变量

局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。
1). 声明

DECLARE 变量名 变量类型 [DEFAULT ... ] ;

变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。

2). 赋值

SET 变量名 =; 

SET 变量名 :=; 

SELECT 字段名 INTO 变量名 FROM 表名 ... ;

演示示例:

-- 声明局部变量 - declare -- 赋值 
create procedure p2() 
begin
    declare stu_count int default 0; 
    select count(*) into stu_count from student; 
    select stu_count; 
end;

call p2();

if

1). 介绍

if 用于做条件判断,具体的语法结构为:

IF 条件1 THEN 
    ..... 
ELSEIF 条件2 THEN   -- 可选 
    ..... 
ELSE               -- 可选 
    ..... 
END IF;

在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有。 ELSE结构可以有,也可以没有。

2). 案例
根据定义的分数score变量,判定当前分数对应的分数等级。

  • score >= 85分,等级为优秀。
  • score >= 60分 且 score < 85分,等级为及格。
  • score < 60分,等级为不及格。
create procedure p3() 
begin
    declare score int default 58; 
    declare result varchar(10); 

    if score >= 85 then 
        set result := '优秀'; 
    else if score >= 60 then 
        set result := '及格'; 
    else
        set result := '不及格'; 
    end if; 
    
    select result; 
end; 

call p3();

上述的需求我们虽然已经实现了,但是也存在一些问题,比如:score 分数我们是在存储过程中定义死的,而且最终计算出来的分数等级,我们也仅仅是最终查询展示出来而已。

那么我们能不能,把score分数动态的传递进来,计算出来的分数等级是否可以作为返回值返回呢?答案是肯定的,我们可以通过接下来所讲解的 参数 来解决上述的问题。

参数

介绍

参数的类型,主要分为以下三种:IN、OUT、INOUT。 具体的含义如下:
在这里插入图片描述
用法:

CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ]) 
BEGIN
    -- SQL语句 
END ;

案例

1). 根据传入参数score,判定当前分数对应的分数等级,并返回。

  • score >= 85分,等级为优秀。
  • score >= 60分 且 score < 85分,等级为及格。
  • score < 60分,等级为不及格。
create procedure p4(in score int, out result varchar(10)) 

begin
    if score >= 85 then 
        set result := '优秀'; 
    else if score >= 60 then
        set result := '及格';
    else
        set result := '不及格';
    end if;

end;

-- 定义用户变量 @result来接收返回的数据, 用户变量可以不用声明

call p4(18, @result);

select @result;

2). 将传入的200分制的分数,进行换算,换算成百分制,然后返回。

create procedure p5(inout score double) 
begin
    set score := score * 0.5; 
end; 

set @score = 198; 
call p5(@score); 

select @score;

case

语法

-- 含义: 当case_value的值为 when_value1时,执行statement_list1,
--       当值为 when_value2时, 执行statement_list2,  
--       否则就执行 statement_list 

CASE case_value 
    WHEN when_value1 THEN statement_list1 
    WHEN when_value2 THEN statement_list2
    ... 
    ELSE statement_list 
END CASE;

-- 含义: 当条件search_condition1成立时,执行statement_list1,
--       当条件search_condition2成 立时,执行statement_list2,
--       否则就执行 statement_list 

CASE
    WHEN search_condition1 THEN statement_list1 
    WHEN search_condition2 THEN statement_list2
    ... 
    ELSE statement_list 
END CASE;

案例
根据传入的月份,判定月份所属的季节(要求采用case结构)。

  • 1-3月份,为第一季度
  • 4-6月份,为第二季度
  • 7-9月份,为第三季度
  • 10-12月份,为第四季度
create procedure p6(in month int) 
begin
    declare result varchar(10); 
    case
        when month >= 1 and month <= 3 then 
            set result := '第一季度'; 
        when month >= 4 and month <= 6 then 
            set result := '第二季度'; 
        when month >= 7 and month <= 9 then 
            set result := '第三季度';
        when month >= 10 and month <= 12 then 
            set result := '第四季度'; 
        else
            set result := '非法参数'; 
end case ; 

select concat('您输入的月份为: ',month, ', 所属的季度为: ',result); 
end; 


call p6(16);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值