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 使用事件(Events)完成计划任务
May 24 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MYSQL事务的隔离级别与MVCC
May 25 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
短波的认识
2021/03/01 无线电
php下intval()和(int)转换使用与区别
2008/07/18 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
python怎么提高计算速度
2020/06/11 Python
python实例化对象的具体方法
2020/06/17 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
公司出纳岗位职责
2013/12/07 职场文书
应用心理学个人的求职信
2013/12/08 职场文书
房产销售经理职责
2013/12/20 职场文书
小学母亲节活动方案
2014/03/14 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL