MySQL数据库之存储过程 procedure

作者:彭世瑜 时间:2024-01-14 17:50:27 

前言:

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变量,会将形参的值重新赋值给实参变量

来源:https://blog.51cto.com/u_13567403/5383596

标签:MySQL,数据库,存储,过程,procedure
0
投稿

猜你喜欢

  • python列表去重的二种方法

    2022-06-02 05:21:41
  • Python实现的端口扫描功能示例

    2022-06-25 10:42:04
  • python代码实现小程序登录流程时序总结

    2022-10-16 17:30:14
  • iPhone应用设计趋势[译]

    2009-11-27 19:52:00
  • Python中最常用的操作列表的几种方法归纳

    2021-01-11 22:06:05
  • 好用的VSCode头部注释插件Fileheader Pro

    2023-07-05 06:16:00
  • 解决在pycharm中显示额外的 figure 窗口问题

    2021-11-29 01:00:26
  • javascript中var与let、const的区别详解

    2024-05-09 15:07:32
  • python实现测试工具(一)——命令行发送get请求

    2022-04-06 03:49:00
  • layui 富文本图片上传接口与普通按钮 文件上传接口的例子

    2024-05-22 10:36:28
  • MySQL数据库如何给表设置约束详解

    2024-01-20 18:28:30
  • python实现模拟数字的魔术游戏

    2021-03-21 17:06:39
  • tab(标签)在使用时的禁忌

    2009-04-16 13:06:00
  • python正则表达式判断字符串是否是全部小写示例

    2021-10-10 08:37:40
  • Python实现向好友发送微信消息

    2021-11-11 18:33:02
  • Python开发网站目录扫描器的实现

    2022-07-09 11:51:02
  • Z-Blog垃圾留言判定新方法

    2009-07-06 13:04:00
  • Python操作RabbitMQ服务器实现消息队列的路由功能

    2022-06-21 00:50:39
  • mysql8.0.20数据目录迁移的方法

    2024-01-25 04:41:18
  • 干涉MySQL优化器使用hash join的方法

    2024-01-21 17:29:52
  • asp之家 网络编程 m.aspxhome.com