MySQL知识点复习 - 存储过程

存储过程

通过 CREATE PROCEDURE 实现的语句集,有输入输出参数,可以声明变量,有控制语句(if/else/case/while等等)。

优点:梭哈,性能高,看上去跟触发器的意思差不多,触发器只是需要触发条件。

应用场景:性能要求高,业务复杂,那些只需要在数据库层面的操作可以写在这里。

缺点:不同数据库的语法都不同,迁移难度++,要是哪天有迁移需求得重写,写太多还混乱。

所以现在有些求职的信息说需要丰富的写存储过程的经验,我看着都有点害怕,里面不是一坨存储过程吧?

基本语法

存储过程没有返回值,不可以放在其他语句中一起用

IN:可以传参到过程中(输入)

OUT:执行完后返回的结果(输出)

INOUT:可以输入也可以输出

创建一个存储过程

sql 复制代码
CREATE PROCEDURE test() -- 这个是存储存储过程的名称
BEGIN  -- 开始

	# 这里就写sql集

end; -- 结束

调用存储过程

重点就是这个call

以前试过直接在mybatis的xml里面直接写一个call也能用,主管给我写好的存储过程,真香哈哈哈

sql 复制代码
CALL TEST(); 

查看创建的存储过程

sql 复制代码
 show PROCEDURE STATUS 
 [where name = 'test'] -- 可以帅选一下

带参数的存储过程

in 输入参数

  1. 可以声明一个值:
sql 复制代码
set test_in = 1;
  1. 创建带参数的存储过程
sql 复制代码
CREATE PROCEDURE test(in test_param_in int)
begin
	xxx
end;
  1. 调用
sql 复制代码
call test(@test_in); 
看到菜鸟教程里面有例子挺好的,贴过来学习一下,原文地址:https://www.runoob.com/w3cnote/mysql-stored-procedure.html
sql 复制代码
mysql> delimiter $$ -- 这个意思是分号的意思,然后加上$$的意思就是 分号的分号的意思,反正意思就是分割上面的写法,然后再结束
mysql> create procedure in_param(in p_in int)
    -> begin
    ->   select p_in;
    ->   set p_in=2;
    ->    select P_in;
    -> end$$
mysql> delimiter ;
 
mysql> set @p_in=1;
 
mysql> call in_param(@p_in);
+------+
| p_in |
+------+
|    1 |
+------+
 
+------+
| P_in |
+------+
|    2 |
+------+
 
mysql> select @p_in; -- 全局变量的值不会被影响
+-------+
| @p_in |
+-------+
|     1 |
+-------+

out 输出参数

out简单的理解就是"返回值"的意思

sql 复制代码
mysql> delimiter
mysql> create procedure out_param(out p_out int)
    ->   begin
    ->     select p_out; -- 输出,不会被传参,因为这个是out,所以下面是个NULL
    ->     set p_out=2; -- 设值,所以下面会输出2
    ->     select p_out;
    ->   end
mysql> delimiter ;
 
mysql> set @p_out=1;
 
mysql> call out_param(@p_out);
+-------+
| p_out |
+-------+
|  NULL |
+-------+

+-------+
| p_out |
+-------+
|     2 |
+-------+
 
mysql> select @p_out;
+--------+
| @p_out |
+--------+
|      2 |
+--------+
# 调用了out_param存储过程,输出参数,改变了p_out变量的值

inout输入参数

sql 复制代码
mysql> delimiter $$
mysql> create procedure inout_param(inout p_inout int)
    ->   begin
    ->     select p_inout; -- 下面传入了参数,所以会输出1
    ->     set p_inout=2; -- 改变这个值
    ->     select p_inout; -- 输出2
    ->   end
    -> $$
mysql> delimiter ;
 
mysql> set @p_inout=1;
 
mysql> call inout_param(@p_inout);
+---------+
| p_inout |
+---------+
|       1 |
+---------+
 
+---------+
| p_inout |
+---------+
|       2 |
+---------+
 
mysql> select @p_inout;
+----------+
| @p_inout |
+----------+
|        2 |
+----------+
# 调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量
相关推荐
大迪deblog7 小时前
系统架构师-数据库-数据库设计
数据库·oracle·系统架构
leo__5207 小时前
IEC 104 协议 C 语言实现
c语言·数据库
摇滚侠7 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
若兰幽竹7 小时前
【从零开始编写数据库系统:架构设计与实现】第5章:查询执行引擎与火山模型
数据库·架构·数据库内核·toydb
天空属于哈夫克38 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
东风破1378 小时前
DM8达梦数据库备份、恢复原理介绍
数据库·oracle·dm达梦数据库
鹏子训8 小时前
AI记忆新思路:用SQLite替代向量数据库,去EMBEDDINGS化,谷歌开源Google Always On Memory Agent
数据库·人工智能·sqlite·embedding
Frank_refuel8 小时前
终端环境下:Ubuntu 22.04.1 安装 MySQL 数据库
数据库·mysql·ubuntu
虹科网络安全9 小时前
艾体宝产品|深度解读 Redis 8.4 新增功能:原子化 Slot 迁移(下)
数据库·redis·bootstrap
有味道的男人10 小时前
对接亚马逊平台接口,商品全量信息一键抓取
数据库