共计 3573 个字符,预计需要花费 9 分钟才能阅读完成。
一位喜好技术的橘右京的哥哥橘左京
前言:什么是存储过程?存储过程就像是一个接口,能够间接去调用,不须要反复的编写。
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 存储过程名称()
begin
declare age int default 0;
select concat('num 的值是',age);
end $
1.5.2 SET 赋值示例:
案例:申明一个年龄变量并通过 SET 赋值后查问值
delimiter $
create procedure 存储过程名称()
begin
declare num int default 0;
set num = num + 10;
select concat('num 的值是',num);
end $
1.5.3 select …into… 赋值示例:
案例:申明一个年龄变量并通过 SELECT INTO 赋值后查问值
delimiter $
create procedure 存储过程名称()
begin
declare 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()
begin
declare age int default 15;
declare words varchar(20) default 10;
if age <=11 then
set words = '儿童';
elseif age >= 12 and age <= 17 then
set words = '青少年';
elseif age >=18 and age <= 29 then
set 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)
begin
declare age int default 15;
declare words varchar(20) default 10;
if age <=11 then
set words = '儿童';
elseif age >= 12 and age <= 17 then
set words = '青少年';
elseif age >=18 and age <= 29 then
set 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))
begin
if age <=11 then
set words = '儿童';
elseif age >= 12 and age <= 17 then
set words = '青少年';
elseif age >=18 and age <= 29 then
set 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 age
when 1 then
set words = '一岁';
when 2 then
set 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 then
set words = '儿童';
when age >=13 and age <= 17 then
set words = '青少年';
when age >=18 and age <= 29 then
set 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)
begin
declare total int default 0;
declare num int default 1;
while total <= n do
set 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)
BEGIN
declare num int default 0;
repeat
set num = num + n;
set n = n-1;
until n = 0
end 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)
BEGIN
declare 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)
感觉有帮忙能够珍藏文章