【MySQL】存储过程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【MySQL】存储过程

概念

存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。在pascal语言中,是有过程和函数的区别的,过程可以理解为没有返回值得函数。不过在C语言总,则没有过程这个概念,统一为函数

创建存储过程

create procedure 存储过程名(参数列表)

begin

存储过程体

end

create procedure user_data()

begin

select * from table_a;

end;


调用存储过程

call user_data();

执行结果:

这就是一个简单的存储过程

屏幕快照 2022-05-16 下午11.03.26.png

参数类型

在上边创建存储过程中,我们知道在user_data()里边可以携带参数的

解释参数

1.in 表示用来输入

2.out 表示用来输出

3.inout 可以用来输入也可以用来输出

携带参数的存储过程

先使用命令删除我们之前创建的user_data的存储过程

drop procedure user_data;

创建在带参数的存储过程

create procedure user_data(in id int)

begin

select * from table_a where id = id;

end

屏幕快照 2022-05-16 下午11.04.08.png

存储过程中的常用数据类型


1.数值类型

int float double decimal(用于钱上)

2.日期类型

timestamp data year

3.字符串

char varchar text


游标的使用


游标也有的资料上称为光标。

我们可以在存储过程中使用游标来对结果集进行循环的处理。

游标的使用步骤基本分为:声明、打开、取值、关闭。

语法:


DECLARE test_cursor CURSOR FOR 结果集; //声明游标

OPEN test_cursor; //打开游标

CLOSE test_cursor; //关闭游标

DECLARE CONTINUE HANDLER FOR NOT FOUND //结果集查询不到数据自动跳出

总结:


游标的声明的语法: declare 游标名称 cursor for 查询语句;

打开光标的语法: open 游标名称;

获取游标数据: fetch 游标名称 into 变量名 1 [,变量名 2 …]

关闭游标的语法: close 游标名称;

游标的基本使用须知:对某个表按照循环的处理,判断循环结束 的条件是捕获 not found 的条件,当 fetch 光标找不到下一条记录的 时候,就会关闭光标然后退出过程。

可能有过 Pascal 编程经验的朋友们都会知道,声明的顺序也是很 重要的,在 SQL 中,我们使用 declare 定义的顺序是:变量、条件、 游标、应用程序

操作 查询出来的数据会放置于临时表中,然后再通过游标去读取数据。


案例

create procedure user_data(out count int)
begin
  declare user_id int;
  -- 游标标识
  declare blag int default 1;
  -- 游标
  declare user_cursor cursor for select data.user_id from mac_user as data;
  -- 处理not fount的异常
  declare continue handler for not found set blag = 0;
  set count = 0;
  -- 打开游标
  open user_cursor;
  -- 执行循环
  read_loop:loop
    -- 获取游标中的值
    fetch user_cursor into user_id;
    -- 检测循环是否
    if blag = 0 then
      -- 跳出循环
      leave read_loop;
    end if;
--    if user_id = 1 then
      set count = count + user_id;
--    end if;
  end loop read_loop;
  -- 关闭游标
  close user_cursor; 
  select count;
end;
call user_data(@count);  

命令查看存储过程


show procedure status;

show create procedure kaka;

存储过程的优点


1.第一点优势就是执行速度快,因为我们的每个sql语句执行都需要经过编译,然后在运行,但是存储过程都是直接编译好了之后直接运行即可

2.第二点优势就是减少网络流量,我们传输一个存储过程比我们传输大量的sql语句的开销要小的多

3.第三点就是提高系统安全性,因为存储过程可以使用权限控制,而且参数化的存储过程可以有效的放置slq注入攻击,保证了其安全性

4.第四点就是耦合性降低,当我们表结构发生变化之后,我们可以修改相应的存储过程,我们的应用程序在一定程度上需要改动的地方就比较少了

5.第五点就是重用性强。因为我们在写好一个存储过程之后,再次调用只需要一个名称即可,也就是一次编写,随处调用,而且使用存储过程也可以让程序的模块化加强


存储过程的缺点


1.移植性差。因为存储过程是和数据库绑定的,如果我们更换数据库之类的操作,可能很多地方需要改动。

2.修改不方便。因为对于存储过程而言,我们并不能特别有效的调试,他的一些bug可能发现的会晚,增加了应用的危险性。

3.优势不明显赘余功能。对于小型的web应用来说,如果我们使用语句缓存,发现编译sql的开销并不大,但是使用在存储过程缺需要检查权限一类的开销,这些赘余功能也会在一定程度上拖累性能


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
205 0
|
17天前
|
存储 SQL 关系型数据库
mysql存储过程示例
mysql存储过程示例
11 0
|
2月前
|
存储 SQL 关系型数据库
[MySQL]存储过程
[MySQL]存储过程
76 0
[MySQL]存储过程
|
2月前
|
存储 关系型数据库 MySQL
MySQL 中的存储过程-3
MySQL 中的存储过程
20 0
|
2月前
|
存储 SQL 关系型数据库
MySQL 中的存储过程-2
MySQL 中的存储过程
18 0
|
3天前
|
SQL 存储 关系型数据库
MySQL Cluster集群安装及使用
MySQL Cluster集群安装及使用
|
18天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
7天前
|
关系型数据库 MySQL 数据库
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
29 4