MySQL----存储过程
创始人
2024-02-25 05:19:35
0

目录

一、存储过程的介绍

二、存储过程的基本语法

三、变量

(1)系统变量

(2)用户自定义变量

(3)局部变量

四、存储过程的语法详解

(1)if判断

(3)条件判断case语句

(4)while循环语句

(5)repeat循环语句

(6)loop循环语句

(7)cursor游标


一、存储过程的介绍

存储过程是事先经经过编译并存储在数据库中的一段SQL语句的集合,调用存储
过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于高效数据处理
的效率是有好处的。
存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用,你可以将
它和C语言中的函数类比,注意是类比而不是相同。
特点:封装,复用,可以接受参数,也可以返回数据,减少网络交互,效率提升

二、存储过程的基本语法


创建存储过程:create procedure 存储过程名称(参数列表)begin-SQL语句end;调用存储过程:call 存储过程名称(参数)查看在哪个数据库下的存储过程的语句:select *from information_schema.routines where routine_schema='数据库名';查看某个存储过程的定义,也就是创建存储过程的语句show create procedure 存储过程名称; 删除存储过程:drop procedure if exists 存储过程名称:

 举例:

#使用class_first数据库
use class_first;
# 开始创建存储过程
create procedure p1()
beginselect *from s;
end;
create procedure p2()
beginselect *from p;
end;
# 调用其中一个存储过程p1
call p1();
# 查看当前数据库存在的存储过程
select *from information_schema.ROUTINES where routine_schema='class_first';
# 查看某一个创建某一个存储过程的语句,假如查看的是存储过程p1
show create procedure p1;

三、变量

(1)系统变量

系统变量是MySQL服务器提供,不是用户自定义的,属于服务器层面,分为全局变量(global)和会话变量(session),会话变量指的是在当前控制台的变量,假如修改了话变量,但是重新打开了另外一个控制台,查看时会发现并未修改。

查看系统变量show [session/global] variables;             查看所有系统变量show [session/global] variables like '...';  可以通过like模糊匹配方式查找变量select @@[session/global].系统变量名         查看指定变量的值设置系统变量set [session/global] 系统变量名=值;set @@[session/global]系统变量=值;
show session variables;
show session variables like 'auto%';set session autocommit=0;关闭了当前会话的自动提交,但是其他会话并未关闭

全局变量的修改在MySQL服务器重新启动后还是会回到初始值,想要永久修改的话,要修改MySQL的部分配置文件。

(2)用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"即可,假如这个时候并未赋值,那么得到的值就是NULL,其作用域为当前连接。

赋值set @变量名=值;set @变量名:=值;select @变量名:=值;从表格查询将查询的数据赋值给变量select 字段名 into @变量名 from 表名; 使用变量select @变量名;
select @s;#并未给s赋值,得到的是NULL

set @ss:=2;
select @io:='opop';
select @ss,@io;

(3)局部变量

 局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明,可以作存储过程
  内的局部变量和输入参数,局部变量的范围是在其内声明的begin...end块。

声明:declare 变量名 变量类型 (如果有默认值则 default...)变量类型:int,bigint,char,varchar,dae,time赋值set 变量名=值set 变量名:=值select 字段名 into 变量名 from 表名...;
create procedure p3()
begindeclare st int default 1;declare sss int;select  count(*) into sss from s;select sss;
end;call p3();

四、存储过程的语法详解

(1)if判断

1:if判断if 条件 then...end if2:if...elseif判断if 条件 then...elseif 条件2 then...end if3:if...else判断
if 条件 then
...
else 
...
end if

(2)参数

参数:in     该类参数作为输入,也就是需要调用时传入值(什么也没有是默认是in参数)out    该类参数作为输出,也就是该参数可以作为返回值inout  既可以作为输入参数,也可以作为输出参数用法:create procedure 存储过程名称([in/out/inout]参数名 参数类型)beginSQL语句end;

举个例子,输入成绩,得到成绩的等级

create procedure p1(in score int,out result varchar(10))
beginif score>=80&&score<=100 thenset result:='优秀';elseif score>=60&&score<=100 thenset result:='及格';elseif score>=0&&score<=100 thenset result:='不及格';elseset result:='输入的参数是非法参数';end if;
end;call p1(819,@ioio);//这里第二个返回的参数是用户自定义的变量,记得要用@哦
select @ioio;

第二个例子是关于inout的使用

create procedure p1(inout result int)
beginset result:=result*0.5;
end;set @9:=100;
call p1(@9);
select @9;

(3)条件判断case语句

casewhen 条件表达式1 then...when 条件表达式2 then......else...
end case;

需求:一月到三月是第一季度,每三个月是一个季度,现在输入一个月份,判断是第几季度。

create procedure p1(in res int,out ul varchar(10))
begincasewhen res>=1&&res<=3 thenset ul:='第一季度';when res>=4&&res<=6 thenset ul:='第二季度';when res>=7&&res<=9 thenset ul:='第三季度';when res>=10&&res<=12 thenset ul:='第四季度';elseset ul:='你输入的是非法参数';end case;
end;call p1(-1,@res);
select  @res;

(4)while循环语句

如果条件是true就继续下去循环知道为false
while 条件 doSQL语句
end while;

需求:求1到n的和:

create procedure p1(in n int)
begindeclare sum int default 0;declare i int default 1;while i<=n doset sum:=sum+i;set i:=i+1;end while;select sum;
end;
call p1(100);

(5)repeat循环语句

repeat和while循环不一样,while循环满足条件继续循环,而repeat循环满足条件则跳出循环。

repeat SQL逻辑until 条件end repeat:

如:求1到n的和

create procedure p1(in n int)
begindeclare sum int default 0;declare i int default 1;repeatset sum:=sum+i;set i=i+1;until i>nend repeat;select sum;
end;
call p1(10);

(6)loop循环语句


loop可以配合一下两个语句实现简单的退出循环leave:退出当前的循环
iterate:结束本次循环,直接进行下一次的循环语法:循环名称:loop循环体end loop;

求1到n之间的和(使用loop)

create procedure p1(in n int)
begindeclare sum int default 0;declare i int default 1;su:loopif i>n thenleave su;end if;set sum:=sum+i;set i:=i+1;end loop;select sum;
end;
call p1(100);

求1到n之间偶数的和

create procedure p2(in n int)
begindeclare sum int default 0;declare i int default 0;su:loopset i:=i+1;if i%2=1 theniterate su;end if;if i>n thenleave su;end if;set sum:=sum+i;end loop;select sum;
end;
call p2(10);

(7)cursor游标

游标是用来莻查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环
的处理。游标的使用包括游标的声明,open,fetch和close。也就是说游标可以歌剧
自己想要的条件得到一个筛选过的结果集。其用法分别如下:

1:声明游标declare 游标名称 cursor for 查询语句;2:打开游标open 游标名称3:获取游标记录fetch 游标名称 into 变量,[变量];4:关闭游标close 游标名

再具体举例之前还得说一下条件处理处理程序,为什么要说呢?在获取游标记录时我们使用循环来获取,直到游标中的数据获取完了,但要怎么判断获取结束,这时候就需要条件处理程序了。

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相对应的处理步骤。语法:declare  行为   handler for 状态码 +sql逻辑语句行为:continue 继续执行当前程序exit 终止执行当前程序状态码如02000之类sqlwarning sql警告,所有以01开头的代码简写not found  未找到数据,所以以02开头sqlexception 没有被sqlwarning和not found捕获的代码简写

具体我们来举个例子

这里我创建了一张表,现在我要将年龄小于自定义输入的值再重新放入一个表格中(如年龄小于20岁):

create table sp(age int,name varchar(10)
);
insert into sp values (18,'李四'),
(20,'张三'),
(12,'王二麻子'),
(80,'赵云'),
(26,'查类'),
(40,'谢逊'),
(63,'李白'),
(52,'杜甫'),
(19,'韩信');

 

create procedure p1(in uage int)
begindeclare usname varchar(10);declare u_age int;declare u_cursor cursor for select name,age from sp where age

 

同时数据库中也出现了stu表

相关内容

热门资讯

从禁到放的政策转身:山西烟花解... 2025 年 12 月 16 日,山西省人民政府发布《关于宣布废止 124 件行政规范性文件的决定》...
权威遗嘱继承律师的选择与易轶律... 在处理遗嘱继承相关事务时,选择一位靠谱的遗嘱继承律师至关重要。著名遗嘱继承律师在行业中具有显著的优势...
AI辅助法律普及:个性化法律知... AI辅助法律普及:法律知识个性化推送与法律文书自动生成,共创法治美景 随着科技的飞速发展,人工智能(...
沈阳劳动纠纷律师推荐辽宁华颖律... 在劳动争议日益增多的当下,劳动者与用人单位之间的权益纠纷往往涉及工资、社保、工伤、劳动关系确认等诸多...
上海发布“游戏沪十条”,为游戏... 12月19日,2025年度中国游戏产业年会在上海徐汇西岸国际会展中心落幕。大会发布《2025年中国游...
原创 1... 山有信/文 近日,“腾讯起诉拼多多不正当竞争”引发了媒体关注和网友热议,反做空一线通过查询案沪通发现...
皇氏集团的“冰与火”:股价涨停... 水牛奶龙头皇氏集团(002329.SZ)近日颇受资金追捧,本周五个交易日收获3个涨停。然而股价大涨难...
深化药械改革 重庆“政策陪跑”... 央广网重庆12月21日消息(记者白刁尹)近日,重庆市药品监督管理局召开“深化药械改革——重庆在行动”...
原创 大... 12月18日晚上,有人在微博看到汪小菲凌晨发帖,指着抖音副总裁李亮说平台封他账号不合理,还附了他和前...
推荐靠谱境外投资咨询律师,杨国... 在当今全球化的经济浪潮中,越来越多的企业和高净值人群将目光投向了境外投资领域。然而,境外投资涉及到复...