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的版本
May 19 MySQL
MySQL触发器的使用
May 24 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
postgresql如何找到表中重复数据的行并删除
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开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
django定期执行任务(实例讲解)
2017/11/03 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
情况说明书格式范文
2014/05/06 职场文书
财务工作个人总结
2015/02/27 职场文书
青涩记忆观后感
2015/06/18 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript