mysql存储过程定义表(MySQL存储过程的创建、调用与管理详解)
mysql存储过程定义表
MySQL存储过程的创建、调用与管理详解目录
-
存储过程简介
- 为什么要用存储过程?
- 存储过程的优点
- 存储过程的缺点
-
MySQL 中的存储过程
- 创建与调用过程
- 存储过程语法解析
- 存储过程的参数
- 变量
- 变量赋值
-
流程控制语句
- if 条件语句
- case 条件语句
- while 循环语句
- repeat 循环语句
- loop 循环语句
- 存储过程的管理
- 总结
存储过程简介
为什么要用存储过程?
mysql5.0 版本开始支持存储过程。
大多数 sql 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作需要多条语句才能完成。
存储过程简单来说,就是为以后的使用而保存的一条或多条 mysql 语句的集合。可将其视为批处理文件。虽然他们的作用不仅限于批处理。
存储过程思想上很简单,就是数据库 sql 语言层面的代码封装与重用。
存储过程的优点
- 通过把处理封装在容易使用的单元中,简化复杂的操作;
- 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不会改自己的代码;
- 通常存储过程有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。 但是,mysql 实现的存储过程略有不同。mysql 存储过程按需编译。在编译存储过程之后,mysql 将其放入缓存中。mysql 为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询;
- 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的 sql 语句,而只用发送存储过程的名称和参数;
- 存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序,以便开发人员不必开发存储过程中已支持的功能;
- 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。
存储过程的缺点
- 如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 此外,如果您在存储过程中过度使用大量逻辑操作,则 cpu 使用率也会增加,因为 mysql 数据库最初的设计侧重于高效的查询,不利于逻辑运算;
- 存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难;
- 很难调试存储过程。只有少数数据库管理系统允许您调试存储过程。不幸的是,mysql 不提供调试存储过程的功能;
- 开发和维护存储过程并不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能会导致应用程序开发和维护阶段的问题。
mysql 中的存储过程
创建与调用过程
创建存储过程,代码如下所示:
|
-- 创建存储过程 create procedure mypro( in a int , in b int , out sum int ) begin set sum = a+b; end ; |
运行结果如下
也可以在 navicat 客户端“函数”节点下查看过程,如下图所示:
调用存储过程,代码如下所示:
|
call mypro(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 中的局部变量作用域是所在的存储过程。
变量定义
|
declare variable_name [,variable_name...] datatype [ default value]; |
declare
用于声明变量;
variable_name
表示变量名称;
datatype
为 mysql 的数据类型;
default
用于声明默认值;
例如:
|
declare name varchar (20) default ‘jack'。 |
变量赋值
|
set 变量名 = 表达式值 [,variable_name = expression ...] |
在存储过程中使用变量,代码如下所示
|
use schooldb; -- 使用 schooldb 数据库 -- 创建过程 create procedure mypro1() begin declare name varchar (20); set name = '丘处机' ; select * from studentinfo where studentname = name ; end ; -- 调用过程 call mypro1(); |
运行结果
流程控制语句
if 条件语句
if
语句包含多个条件判断,根据结果为 true
、false
执行语句,与编程语言中的 if
、else if
、else
语法类似。
定义存储过程,输入一个整数,使用 if 语句判断是正数还是负数,代码如下所示:
|
-- 创建过程 create procedure mypro2( in num int ) begin if num<0 then -- 条件开始 select '负数' ; elseif num=0 then select '不是正数也不是负数' ; else select '正数' ; end if; -- 条件结束 end ; -- 调用过程 call mypro2(-1); |
运行结果
case 条件语句
case
是另一个条件判断的语句,类似于编程语言中的 choose
、when
语法。mysql 中的 case
语句有两种语法
格式。
定义存储过程,输入一个整数,使用 case 语句判断是正数还是负数,代码如下所示:
|
-- 创建过程 create procedure mypro3( in num int ) begin case -- 条件开始 when num<0 then select '负数' ; when num=0 then select '不是正数也不是负数' ; else select '正数' ; end case ; -- 条件结束 end ; -- 调用过程 call mypro3(1); |
运行结果
定义存储过程,输入一个整数,使用 case 语句判断是 1 还是 2,代码如下所示:
|
-- 创建过程 create procedure mypro4( in num int ) begin case num -- 条件开始 when 1 then select '数值是 1' ; when 2 then select '数值是 2' ; else select '不是 1 也不是 2' ; end case ; -- 条件结束 end ; -- 调用过程 call mypro4(3); |
运行结果
两种 case 语法都可以实现条件判断,但第一种适合范围值判断,而第二种适合确定值判断。
while 循环语句
while
语句的用法和 java
中的 while
循环类似。
定义存储过程,使用 while 循环输出 1 到 10 的累加和,代码如下所示:
|
-- 创建过程 create procedure mypro5( out sum int ) begin declare num int default 0; set sum = 0; while num<10 do -- 循环开始 set num = num+1; set sum = sum +num; end while; -- 循环结束 end ; -- 调用过程 call mypro5(@ sum ); -- 查询变量值 select @ sum ; |
运行结果
repeat 循环语句
repeat
语句的用法和 java
中的 do…while
语句类似,都是先执行循环操作,再判断条件,区别是 repeat
表达
式值为 false
时才执行循环操作,直到表达式值为 true
停止。
定义存储过程,使用 repeat 循环输出 1 到 10 的累加和,代码如下所示:
|
-- 创建过程 create procedure mypro6( out sum int ) begin declare num int default 0; set sum = 0; repeat -- 循环开始 set num = num+1; set sum = sum +num; until num>=10 end repeat; -- 循环结束 end ; -- 调用过程 call mypro6(@ sum ); -- 查询变量值 select @ sum ; |
运行结果
loop 循环语句
循环语句,用来重复执行某些语句。
执行过程中可使用 leave
语句或 iterate
跳出循环,也可以嵌套 if
等判断语句。
leave
语句效果相当于 java 中的 break
,用来终止循环;
iterate
语句效果相当于 java 中的 continue
,用来结束本次循环操作,进入下一次循环。
定义存储过程,使用 loop 循环输出 1 到 10 的累加和,代码如下所示:
|
-- 创建过程 create procedure mypro7( out sum int ) begin declare num int default 0; set sum = 0; loop_sum:loop -- 循环开始 set num = num+1; set sum = sum +num; if num>=10 then leave loop_sum; end if; end loop loop_sum; -- 循环结束 end ; -- 调用过程 call mypro7(@ sum ); -- 查询变量值 select @ sum ; |
运行结果
代码中的 loop_sum 相当于给循环贴个标签,方便多重循环时灵活操作。
存储过程的管理
存储过程的管理主要包括:显示过程、显示过程源码、删除过程。
比较简单的方式就是利用 navicat 客户端工具进行管理,鼠标点击操作即可,如下图所示:
显示存储过程
|
show procedure status; |
显示特定数据库的存储过程
|
show procedure status where db = 'schooldb' ; |
显示特定模式的存储过程,要求显示名称中包含“my”的存储过程
|
show procedure status where name like '%my%' ; |
显示存储过程“mypro1”的源码
|
show create procedure mypro1; |
删除存储过程“mypro1”
|
drop procedure mypro1; |
总结
到此这篇关于mysql存储过程的创建、调用与管理的文章就介绍到这了,更多相关mysql存储过程内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/whf_a/article/details/114871866
- mysql完全快速清空一个表(浅谈MySQL如何优雅的做大表删除)
- iis上搭建php环境(vultr服务器windows server 2012 r2搭建IIS8+PHP+MYSQL+phpMyAdmin运行环境图文教程)
- mysql的三种模式(详解 MySQL的FreeList机制)
- mysql join规则(浅谈为什么MySQL不推荐使用子查询和join)
- mysql数据库基本使用方法(详解MySQL 数据库范式)
- mysql死锁情况(MySQL kill不掉线程的原因)
- mysql定期备份(Mysql5.7定时备份的实现)
- mysql自定义函数怎么设置(MySQL自定义变量?学不废不收费~)
- mysql 5.5.27 winx64安装配置方法图文教程(mysql 5.5.27 winx64安装配置方法图文教程)
- mysql视图管理方法(MySQL 视图View原理解析)
- mysql语句性能分析(聊聊MySQL的COUNT*的性能)
- rename重命名mysql表(MySQL 重命名表的操作方法及注意事项)
- mysql存储json的方式(MySQL中查询json格式的字段实例详解)
- mysql字符串默认长度(MySQL 字符类型大小写敏感)
- mysql数据结构讲解(详解MySQL 数据库隔离级别与MVCC)
- mysql的常见优化(详解GaussDB for MySQL性能优化)
- 乡村爱情15 宋晓峰怀疑自己孩子,腾飞与姜奶奶亲子鉴定出结果(宋晓峰怀疑自己孩子)
- 《乡村爱情13》开播,新版刘能以假乱真,编剧思维进入瓶颈(新版刘能以假乱真)
- 当年的 白洋淀战神 练肌肉 嘎子哥也成为行走的荷尔蒙(当年的白洋淀战神)
- 肌肉小子陈康, 亚洲巨兽 黄哲勋,哪个才是你的菜(肌肉小子陈康亚洲巨兽)
- 新闻周刊 青岛网红 赵厂长 编段子一箩筐输出快乐,陪父亲十二载勇斗病魔(新闻周刊青岛网红)
- 44岁夏雨演谋女郎爸,大其24岁却看不出,互动不怕袁泉吃醋(44岁夏雨演谋女郎爸)
热门推荐
- win10下ftp服务器怎么配置(个人主机如何搭建FTP服务器?win10版本)
- mysql数据库事务处理(MySQL数据库事务与锁深入分析)
- MySQL中TIMESTAMP和DATETIME
- laravel获取访问来路的函数(Laravel实现搜索的时候分页并携带参数)
- activiti需要sql语句吗(Activiti-Explorer使用sql server数据库实现方法)
- python创建一个xls文件(Python XlsxWriter模块Chart类用法实例分析)
- python字符串的拼接与分割(Python字符串通过'+'和join函数拼接新字符串的性能测试比较)
- dedecms专用环境搭建简单工具(dedecms 搜索时出现“SphinxClient类找不到”解决方法)
- docker如何搭建gitlab(docker+gitlab+gitlab-runner部署详解)
- 用idea设置tomcat(Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9