MySQL存储过程的创建、调用与管理的案例分析
这篇文章主要介绍MySQL存储过程的创建、调用与管理的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
存储过程简介
为什么要用存储过程?
MySQL5.0 版本开始支持存储过程。
大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作需要多条语句才能完成。
存储过程简单来说,就是为以后的使用而保存的一条或多条 MySQL 语句的集合。可将其视为批处理文件。虽然他们的作用不仅限于批处理。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程的优点
通过把处理封装在容易使用的单元中,简化复杂的操作;
简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不会改自己的代码;
通常存储过程有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。 但是,MySQL 实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储过程之后,MySQL 将其放入缓存中。MySQL 为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询;
存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的 SQL 语句,而只用发送存储过程的名称和参数;
存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序,以便开发人员不必开发存储过程中已支持的功能;
存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。
存储过程的缺点
如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 此外,如果您在存储过程中过度使用大量逻辑操作,则 CPU 使用率也会增加,因为 MySQL 数据库最初的设计侧重于高效的查询,不利于逻辑运算;
存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难;
很难调试存储过程。只有少数数据库管理系统允许您调试存储过程。不幸的是,MySQL 不提供调试存储过程的功能;
开发和维护存储过程并不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能会导致应用程序开发和维护阶段的问题。
MySQL 中的存储过程
创建与调用过程
创建存储过程,代码如下所示:
--创建存储过程 createproceduremypro(inaint,inbint,outsumint) begin setsum=a+b; end;
运行结果如下
也可以在 Navicat 客户端“函数”节点下查看过程,如下图所示:
调用存储过程,代码如下所示:
callmypro(1,2,@s);--调用存储过程 select@s;--显示过程输出结果
运行结果
存储过程语法解析
create procedure 用来创建过程;
mypro 用来定义过程名称;
(in a int,in b int,out sum int)表示过程的参数,其中 in 表示输入参数,out 表示输出参数。类似于 Java 定义方法时的形参和返回值;
begin 与end 表示过程主体的开始和结束,相当于 Java 定义方法的一对大括号;
call用来调用过程,@s 是用来接收过程输出参数的变量
存储过程的参数
MySQL 存储过程的参数用在存储过程的定义,共有三种参数类型:
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。
存储过程根据参数可分为四种类别:
1).没有参数的过程;
2).只有输入参数的过程;
3).只有输出参数的过程;
4).包含输入和输出参数的过程。
变量
MySQL 中的存储过程类似 java 中的方法。
既然如此,在存储过程中也同样可以使用变量。java 中的局部变量作用域是变量所在的方法,而 MySQL 中的局部变量作用域是所在的存储过程。
变量定义
DECLAREvariable_name[,variable_name...]datatype[DEFAULTvalue];
declare
用于声明变量;
variable_name
表示变量名称;
datatype
为 MySQL 的数据类型;
default
用于声明默认值;
例如:
declarenamevarchar(20)default‘jack'。
变量赋值
SET变量名=表达式值[,variable_name=expression...]
在存储过程中使用变量,代码如下所示
useschooldb;--使用schooldb数据库 --创建过程 createproceduremypro1() begin declarenamevarchar(20); setname='丘处机'; select*fromstudentinfowherestudentname=name; end; --调用过程 callmypro1();
运行结果
流程控制语句
if 条件语句
IF
语句包含多个条件判断,根据结果为 TRUE
、FALSE
执行语句,与编程语言中的 if
、else if
、else
语法类似。
定义存储过程,输入一个整数,使用 if 语句判断是正数还是负数,代码如下所示:
--创建过程 createproceduremypro2(innumint) begin ifnum<0then--条件开始 select'负数'; elseifnum=0then select'不是正数也不是负数'; else select'正数'; endif;--条件结束 end; --调用过程 callmypro2(-1);
运行结果
case 条件语句
case
是另一个条件判断的语句,类似于编程语言中的 choose
、when
语法。MySQL 中的 case
语句有两种语法格式。
定义存储过程,输入一个整数,使用 case 语句判断是正数还是负数,代码如下所示:
--创建过程 createproceduremypro3(innumint) begin case--条件开始 whennum<0thenselect'负数'; whennum=0thenselect'不是正数也不是负数'; elseselect'正数'; endcase;--条件结束 end; --调用过程 callmypro3(1);
运行结果
定义存储过程,输入一个整数,使用 case 语句判断是 1 还是 2,代码如下所示:
--创建过程 createproceduremypro4(innumint) begin casenum--条件开始 when1thenselect'数值是1'; when2thenselect'数值是2'; elseselect'不是1也不是2'; endcase;--条件结束 end; --调用过程 callmypro4(3);
运行结果
两种 case 语法都可以实现条件判断,但第一种适合范围值判断,而第二种适合确定值判断。
while 循环语句
while
语句的用法和 java
中的 while
循环类似。
定义存储过程,使用 while 循环输出 1 到 10 的累加和,代码如下所示:
--创建过程 createproceduremypro5(outsumint) begin declarenumintdefault0; setsum=0; whilenum<10do--循环开始 setnum=num+1; setsum=sum+num; endwhile;--循环结束 end; --调用过程 callmypro5(@sum); --查询变量值 select@sum;
运行结果
repeat 循环语句
repeat
语句的用法和 java
中的 do…while
语句类似,都是先执行循环操作,再判断条件,区别是 repeat
表达式值为 false
时才执行循环操作,直到表达式值为 true
停止。
定义存储过程,使用 repeat 循环输出 1 到 10 的累加和,代码如下所示:
--创建过程 createproceduremypro6(outsumint) begin declarenumintdefault0; setsum=0; repeat--循环开始 setnum=num+1; setsum=sum+num; untilnum>=10 endrepeat;--循环结束 end; --调用过程 callmypro6(@sum); --查询变量值 select@sum;
运行结果
loop 循环语句
循环语句,用来重复执行某些语句。
执行过程中可使用 leave
语句或 iterate
跳出循环,也可以嵌套 IF
等判断语句。
leave
语句效果相当于 java 中的 break
,用来终止循环;
iterate
语句效果相当于 java 中的 continue
,用来结束本次循环操作,进入下一次循环。
定义存储过程,使用 loop 循环输出 1 到 10 的累加和,代码如下所示:
--创建过程 createproceduremypro7(outsumint) begin declarenumintdefault0; setsum=0; loop_sum:loop--循环开始 setnum=num+1; setsum=sum+num; ifnum>=10then leaveloop_sum; endif; endlooploop_sum;--循环结束 end; --调用过程 callmypro7(@sum); --查询变量值 select@sum;
运行结果
代码中的 loop_sum 相当于给循环贴个标签,方便多重循环时灵活操作。
存储过程的管理
存储过程的管理主要包括:显示过程、显示过程源码、删除过程。
比较简单的方式就是利用 navicat 客户端工具进行管理,鼠标点击操作即可,如下图所示:
显示存储过程
SHOWPROCEDURESTATUS;
显示特定数据库的存储过程
SHOWPROCEDUREstatuswheredb='schooldb';
显示特定模式的存储过程,要求显示名称中包含“my”的存储过程
SHOWPROCEDUREstatuswherenamelike'%my%';
显示存储过程“mypro1”的源码
SHOWCREATEPROCEDUREmypro1;
删除存储过程“mypro1”
dropPROCEDUREmypro1;
以上是“MySQL存储过程的创建、调用与管理的案例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
navicat(for mysql 过期如何解决 Navicat for MySQL如何使用)
NavicatforMySQL如何使用?1.下载NavicatforMySQL软件后。2.在文件里找到navicat.Na...
-
pycharm(mysql 安装教程 学python这条路怎么走)
学python这条路怎么走?如何学习Python?这是很多新手都会问的问题。这时候问问自己,学Python到底想干什么?为了兴趣?...
-
MySQL索引怎么创建和删除
MySQL索引怎么创建和删除这篇文章主要介绍了MySQL索引怎么创...
-
MySQL查看锁的代码怎么写
MySQL查看锁的代码怎么写本文小编为大家详细介绍“MySQL查看...
-
在 PHP 7 中不要做的 10 件事
1.不要使用MySQL_函数这一天终于来了,从此你不仅仅“不应该”使用mysql_函数。PHP7已经把它们从核心...
-
MySQL体系架构,超详细
-
利用PHP访问MySql数据库以及增删改查实例操作
关于利用PHP访问MySql数据库的逻辑操作以及增删改查实例操作PHP访问MySql数据库˂?php//造连...
-
密码攻防系列文章6:服务器MySQL账号扫描及攻击
-
计算机毕业设计php创建mysql数据库
-
PHP动态网站设计试题