MySQL数据库之存储过程 procedure


Posted in MySQL onJune 16, 2022

前言:

stored procedure 完成特定功能的SQL语句集,存储在数据库中,经过第一次编译之后再次调用不需要编译(效率较高)

1、存储过程与函数的区别

1.1、相同点

  • 都是为了可重复地执行操作数据库的SQL语句集合
  • 都是一次编译,多次执行

1.2、不同点

  • 标识符不同,函数function 过程 procedure
  • 函数中有返回值,且必须返回,而过程没有返回值
  • 过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除了在select中,必须将返回值赋值给变量
  • 函数可以再select语句中直接使用,而过程不能

2、存储过程的操作

2.1、创建过程

基本语法:

create procedure 过程名字([参数列表])
bengin
    过程体
end
结束符

如果只有只有一条指令可以省略begin和end

create procedure my_pro1()
select * from my_student;

过程基本上可以完成函数对应的所有功能:

-- 修改语句结束符
delimiter $$
-- 创建过程
create procedure my_pro2()
begin
    -- 求1到100之间的和
    -- 创建局部变量
    declare i int default 1;
    -- declare sum int default 0;
    -- 会话变量
    set @sum = 0;
    -- 开始循环获取结果
    while i <= 100 do
        -- 求和
        set @sum = @sum + i;
        set i = i + 1;
    end while;

    -- 显示结果
    select @sum;
end
$$
delimiter ;

2.2、查看过程

-- 查看所有存储过程
show procedure status [like 'pattern'];
-- 查看过程的创建语句
show create procedure 过程名字\G

2.3、调用过程

过程没有返回值

基本语法:

call 过程名([实参列表]);
-- eg:
call my_pro2();
+------+
| @sum |
+------+
| 5050 |
+------+

2.4、删除过程

基本语法:

drop procedure 过程名;

3、存储过程的形参类型

存储过程的参数和函数一样,需要制定其类型

但是存储过程对参数还有额外的要求,自己的参数分类:

  • in:(值传递)参数从外部传入,在过程内部使用,可以是直接数据,也可以是保存数据的变量
  • out:(引用传递)参数在过程中赋值,传入必须是变量,如果有外部数据,会被清空为null
  • inout:(引用传递)数据可以从外部传入过程内部使用,同时内部操作之后,又回将数据返回给外部

代码示例:

-- 创建3个会话变量
set @var1 = 1;
set @var2 = 2;
set @var3 = 3;
-- 查询会话变量
select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
|     1 |     2 |     3 |
+-------+-------+-------+
1 row in set (0.00 sec)
-- 修改语句结束符
delimiter $$
-- 定义过程
create procedure my_pro3(in a int, out b int, inout c int)
begin
    -- 查看传入的3个数据值
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |    1 | NULL |    3 |
    -- +------+------+------+
    -- 修改3个变量值
    set a = 10;
    set b = 20;
    set c = 30;
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |   10 |   20 |   30 |
    -- +------+------+------+
    -- 查看会话变量
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- |     1 |     2 |     3 |
    -- +-------+-------+-------+
    -- 修改会话变量
    set @var1 = 'a';
    set @var2 = 'b';
    set @var3 = 'c';
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- | a     | b     | c     |
    -- +-------+-------+-------+
end
$$
delimiter ;
-- 调用过程
call my_pro3(@var1, @var2, @var3);

-- 再次查看会话变量
mysql> select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
| a     |    20 |    30 |
+-------+-------+-------+

分析:

  • 1、实参传入过程之后,实际上没有改变外部变量的值,而是把值给了形参,out类型不能接收外部变量的值,默认为null
  • 2、当过程执行到end 的时候,如果是out或inout变量,会将形参的值重新赋值给实参变量

Tags in this post...

MySQL 相关文章推荐
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MySQL 数据 data 基本操作
May 04 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
MySQL索引失效十种场景与优化方案
May 08 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 #MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 #MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 #MySQL
MySQL聚簇索引和非聚簇索引的区别详情
关于mysql中string和number的转换问题
Jun 14 #MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 #MySQL
You might like
PHP写的求多项式导数的函数代码
2012/07/04 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
javascript tips提示框组件实现代码
2010/11/19 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
英国计算机商店:Technextday
2019/12/28 全球购物
机械专业毕业生自荐信
2013/11/02 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书