一位喜好技术的橘右京的哥哥橘左京

前言:什么是存储过程?存储过程就像是一个接口,能够间接去调用,不须要反复的编写。

1.1 存储过程和函数概述

存储过程和函数是当时通过编译并存储在数据库的一段SQL语句的汇合,调用存储过程和函数能够简化开发人员的很多工作,缩小数据和应用服务器之间的传输,对于进步数据处理的效率是有益处的。
存储过程和函数的区别在于函数必须有返回值,而存储过程没有。

1.2 创立存储过程

语句:

delimiter $
create procedure 存储过程名称()
begin
SQL语句;
end$

释义:delimiter的中文解释为‘分隔符’,示意将“$”代替“;”设置为分隔符,因为在begin后的SQL语句中须要以";"结尾,所以就要设置一个与";"辨别开的分隔符。

1.3 调用存储过程

语法:call 存储过程名称;
执行创立存储过程实现后,应用调用办法调用存储过程。

1.4 查看存储过程

查询数据库中的存储过程

select name from mysql.proc where db = 'test'

查问存储过程的状态信息

show procedure status;

1.5 变量

· DECLARE
通过DECLARE能够定义一个变量,该变量的作用范畴用于BEGIN...END之间

1.5.1 申明变量示例:
案例:申明一个年龄变量并查问值

delimiter $create procedure 存储过程名称()begindeclare age int default 0;select  concat('num的值是',age);end $

1.5.2 SET赋值示例:
案例:申明一个年龄变量并通过SET赋值后查问值

delimiter $create procedure 存储过程名称()begindeclare num int default 0;set num = num + 10;select  concat('num的值是',num);end $

1.5.3 select ...into...赋值示例:
案例:申明一个年龄变量并通过SELECT INTO 赋值后查问值

delimiter $create procedure 存储过程名称()begindeclare num int;select count(1) into num from bsx_user;select num;end $

1.6 IF语法判断

案例:当年龄段为12岁以下输入青年,当年龄在12-17输入青少年,18-29岁输入青年

delimiter $create procedure test01()begindeclare age int default 15;declare words varchar(20) default 10;if age <=11 thenset words = '儿童';elseif age >= 12 and age <= 17 then set words = '青少年';elseif age >=18 and age <= 29 thenset words = '青年';end if;select concat('年龄:',age,'属于:',words);end $

1.7 输出/输入 参数

1.7.1 案例:输出参数 传参
-- 当年龄段为12岁以下输入儿童,当年龄在12-17输入青少年,18-29岁输入青年

语法:create procedure test01([in/out/inout] 参数名 参数类型)
IN: 默认为该办法 调用方传入值作为输出参数
OUT: 该参数作为输入,也就是参数能够作为返回值
OUTIN: 既能够作为输出参数,也能够作为输入参数

创立可传入参数的存储过程:

>delimiter $create procedure test01(in age int)begindeclare age int default 15;declare words varchar(20) default 10;if age <=11 thenset words = '儿童';elseif age >= 12 and age <= 17 then set words = '青少年';elseif age >=18 and age <= 29 thenset words = '青年';end if;select concat('年龄:',age,'属于:',words);end $

调用存储过程:

call test01(15)

1.7.2 案例:输入参数 传参
-- 当年龄段为12岁以下返回儿童,当年龄在12-17返回青少年,18-29岁返回青年
依据传入的年龄大小返回对应的年龄区间名称:

delimiter $create procedure test01(in age int,out words varchar(20))beginif age <=11 thenset words = '儿童';elseif age >= 12 and age <= 17 then set words = '青少年';elseif age >=18 and age <= 29 thenset words = '青年';end if;end $

调用存储过程:

call test01(15)

查问返回的后果:

select @words ;         (words是申明的变量名)
小常识:
@words:像这种后面带着@符号的变量称为会话变量,在整个会话过程起作用,相似于全局变量。
@@words:带有两个@@符号的被称为零碎变量。

1.8 CASE语法结构

1.8.1 形式一(根本的CASE语法结构)
语法:

case XXX
when 1 then
赋值;
when 2 then
赋值;
else
赋值;
end case;

创立存储过程:
(输出1返回1岁 输出2返回2岁,输出其余文本输入"其余")

delimiter $create procedure test01(age int,out words varchar(20))begin case agewhen 1 thenset words = '一岁';when 2 thenset words = '二岁';else  set words = '其余';end case;end $;    

调用存储过程:

call test01(1,@words)

查问返回的后果:

select @words;

1.8.2 形式二(带有表达式的CASE语法结构)
语法:

case
when 表达式 then
赋值;
else
赋值;
end case;

创立存储过程:
(输出0-12 返回儿童,输出13-17返回青少年,输出18-29返回青年,输出其余值返回“老年”)

delimiter $create procedure test01(age int)begin declare words varchar(20);case when age >=0 and age <= 12 thenset words = '儿童';when age >=13 and age <= 17 thenset words = '青少年';when age >=18 and age <= 29 thenset words = '青年';else  set words = '老年';end case;select words;end $;

调用存储过程查问返回的后果:

call test01(15);

1.9 While循环

特色:满足条件持续循环
语法:

while a<=10 do
....
end while;

创立存储过程:
(输出一个数,累加超过这个数字时候进行循环并显示数字)

delimiter $create procedure test01(n int)begindeclare total int default 0;declare num int default 1;while total <= n doset total = total + num;set num = num + 1;end while;select total;end $

调用存储过程:

call test01(2)

1.10 repeat循环

特色:满足条件退出循环
语法:

repeat
循环语句...
until 条件语句
end repeat;

创立存储过程:

(计算 1+到n的值)delimiter $create procedure test01(n int)BEGINdeclare num int default 0;repeat set num = num + n;set n = n-1;until  n = 0end repeat;select num;end $

调用存储过程:

call test01(5)

1.11 loop循环

特色:满足条件退出循环
语法:

XX:loop (XX代表别名)
循环语句...
if XX<=0 then (因为loop不带有进行循环的判断语句 所以用IF)
leave c;
end if;
end loop c;

创立存储过程:
(计算 1+到n的值)

delimiter $create procedure test01(n int)BEGINdeclare num int default 0;c:loop    set num = num + n;    set n = n - 1;    if n <= 0 then    leave c;    end if;end loop c;select num;end $

调用存储过程:

call test01(5)

感觉有帮忙能够珍藏文章