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获取所有分类的前N条记录
May 07 MySQL
新手入门Mysql--概念
Jun 18 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL 数据表操作
May 04 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
MySql按时,天,周,月进行数据统计
Aug 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
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
用 JSON 处理缓存
2007/04/27 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python数学形态学实例分析
2019/09/06 Python
pandas的相关系数与协方差实例
2019/12/27 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
办公室文员工作自我评价
2013/12/01 职场文书
名人演讲稿范文
2013/12/28 职场文书
小学清明节活动总结
2014/07/04 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
安全教育主题班会教案
2015/08/12 职场文书
cypress测试本地web应用
2022/06/01 Javascript