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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
Mysql MVCC机制原理详解
Apr 20 MySQL
MySQL数字类型自增的坑
May 07 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
mysql sql常用语句大全
Jun 21 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 使用curl提交json格式数据
2013/06/29 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
Javascript - HTML的request类
2006/07/15 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
vue实现放大镜效果
2020/09/17 Javascript
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
使用python实现链表操作
2018/01/26 Python
python删除某个字符
2018/03/19 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
C++面试题:关于链表和指针
2013/06/05 面试题
什么是数组名
2012/05/10 面试题
学生自我鉴定范文
2013/10/04 职场文书
机械设计专业应届生求职信
2013/11/21 职场文书
八一建军节感言
2014/02/28 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
医德医风个人总结
2015/02/28 职场文书
今日说法观后感
2015/06/08 职场文书
创业计划书介绍
2019/04/24 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL