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 角色(role)功能介绍
Apr 24 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
mysql 索引合并的使用
Aug 30 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
CentOS MySql8 远程连接实战
Apr 19 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聊天室技术
2006/10/09 PHP
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript中关于执行环境的杂谈
2011/08/14 Javascript
js 幻灯片的实现
2011/12/06 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
python如何求解两数的最大公约数
2018/09/27 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Python装饰器用法与知识点小结
2020/03/09 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
实习生单位鉴定意见
2013/12/04 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
逃课检讨书
2015/01/26 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python