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之DML语言
Apr 05 MySQL
MySQL 慢查询日志深入理解
Apr 22 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 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应用技巧
2008/03/27 PHP
用php实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
详解Document.Cookie
2015/12/25 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python元组的概念知识点
2019/11/19 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
工商管理实习生自我鉴定范文
2013/12/18 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
广播体操比赛口号
2014/06/10 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL