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
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
浅谈MySQL函数
Oct 05 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 MySQL
MySQL count(*)统计总数问题汇总
Sep 23 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
Yii使用Captcha验证码的方法
2015/12/28 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
js 调用百度分享功能
2017/02/27 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
javascript for循环性能测试示例
2019/08/07 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python运行的17个时新手常见错误小结
2012/08/07 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python3 修改默认环境的方法
2019/02/16 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
全陪导游欢迎词
2014/01/17 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
村党支部公开承诺书
2014/05/29 职场文书
放假通知
2015/04/14 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js