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入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL索引失效十种场景与优化方案
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第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
php中stdClass的用法分析
2015/02/27 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
php递归函数怎么用才有效
2018/02/24 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Python如何对XML 解析
2020/06/28 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
工会工作先进事迹
2014/08/18 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
捐书活动倡议书
2015/04/27 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers