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 02 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL 数据类型详情
Nov 11 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 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/03/22 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
php多进程应用场景实例详解
2019/07/22 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
js表格分页实现代码
2009/09/18 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
django列表筛选功能的实现代码
2020/03/27 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
优秀的毕业生的自我评价
2013/12/12 职场文书
机关道德讲堂实施方案
2014/03/15 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
怎么用Python识别手势数字
2021/06/07 Python
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
Python+Appium自动化测试的实战
2021/06/30 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python