上一篇:14【视图】

下一篇:16【数据库的范式】

目录:【MySQL零基础系列教程】


文章目录

  • 15【存储过程和存储函数】
    • 15.1 存储程序优缺点
    • 15.2 存储过程的使用
    • 15.3 存储过程的语法
      • 15.3.1 变量
      • 15.3.2 if语句
      • 15.3.3 传递参数
        • in-输入参数
        • out-输出参数
      • 15.3.4 case语句
      • 15.3.5 while循环
      • 15.3.6 repeat循环
      • 15.3.7 loop循环
      • 15.3.8 游标
    • 15.4 存储过程和存储函数的区别

15【存储过程和存储函数】

MySQL中提供存储过程与存储函数机制,我们先将其统称为存储程序,一般的SQL语句需要先编译然后执行,存储程序是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,当用户通过指定存储程序的名字并给定参数(如果该存储程序带有参数)来调用才会执行。

15.1 存储程序优缺点

  • 优点

通常存储过程有助于提高应用程序的性能。当创建,存储过程被编译之后,就存储在数据库中。 但是,MySQL实现的存储过程略有不同。 MySQL存储过程需要编译。 在编译存储过程之后,MySQL将其放入缓存中。 MySQL为每个连接维护自己的存储过程高速缓存。 如果应用程序在单个连接中多次使用存储过程,则使用编译版本

1)**性能:**存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的SQL语句,而只能发送存储过程的名称和参数。

2)**复用:**存储的程序对任何应用程序都是可重用的和透明的。 存储过程将数据库接口暴露给所有应用程序,以便开发人员不必开发存储过程中已支持的功能。

3)**安全:**存储的程序是安全的。 数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。

  • 缺点

1)如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 此外,如果在存储过程中过度使用大量逻辑操作,则CPU使用率也会增加。

2)很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。

3)我们在开发中,性能的瓶颈往往就是数据库层,我们应该想尽办法来优化数据库的性能,而不是徒增数据库的压力。

4)业务耦合,如果编写存储程序,那么业务逻辑滞后到了数据库端

15.2 存储过程的使用

  • 语法
CREATE PROCEDURE procedure_name ([parameters[,...]])
begin
-- SQL语句
end ;
  • 示例
create procedure test1()
beginselect 'Hello';
end;
  • 调用存储过程
call test1();
  • 查看存储过程
-- 查看db01数据库中的所有存储过程
select name from mysql.proc where db='db01';-- 查看存储过程的状态信息
show procedure status;-- 查看存储过程的创建语句
show create procedure test1;
  • 删除存储过程
drop procedure test1;

15.3 存储过程的语法

15.3.1 变量

  • declare:声明变量
CREATE PROCEDURE test2 ()
begindeclare num int default 0;     -- 声明变量,赋默认值为0select num+10;end ;call test2();         -- 调用存储过程
  • set:赋值操作
CREATE PROCEDURE test3 ()
begindeclare num int default 0;set num =20;            -- 给num变量赋值select num;end ;call test3();
  • into:赋值
CREATE PROCEDURE test4 ()
begindeclare num int default 0;         select count(1) into num from student;select num;end ;call test4();

15.3.2 if语句

  • 需求:

根据class_id判断是Java还是UI还是产品

CREATE PROCEDURE test5 ()
begindeclare id int default 1;          declare class_name varchar(30);if id=1 thenset class_name='哇塞,Java大佬!';elseif id=2 thenset class_name='原来是UI的啊';elseset class_name='不用想了,肯定是产品小样';end if;select class_name;end ;call test5();

15.3.3 传递参数

  • 语法:
create procedure procedure_name([in/out/inout] 参数名  参数类型)
  • in: 该参数可以作为输入,也就是需要调用方传入值 , 默认
  • out: 该参数作为输出,也就是该参数可以作为返回值
  • inout: 既可以作为输入参数,也可以作为输出参数

in-输入参数

-- 定义一个输入参数
CREATE PROCEDURE test6 (in id int)
begindeclare class_name varchar(30);if id=1 thenset class_name='哇塞,Java大佬!';elseif id=2 thenset class_name='原来是UI的啊';elseset class_name='不用想了,肯定是产品小样';end if;select class_name;
end ;call test6(3);

out-输出参数

-- 定义一个输入参数和一个输出参数
CREATE PROCEDURE test7 (in id int,out class_name varchar(100))
beginif id=1 thenset class_name='哇塞,Java大佬!';elseif id=2 thenset class_name='原来是UI的啊';elseset class_name='不用想了,肯定是产品小样';end if;end ;call test7(1,@class_name); -- 创建会话变量       select @class_name;        -- 引用会话变量

@xxx:代表定义一个会话变量,整个会话都可以使用,当会话关闭(连接断开)时销毁

@@xxx:代表定义一个系统变量,永久生效,除非服务器重启。

15.3.4 case语句

  • 需求:

传递一个月份值,返回所在的季节。

CREATE PROCEDURE test8 (in month int,out season varchar(10))
begincase when month >=1 and month<=3 thenset season='spring';when month >=4 and month<=6 thenset season='summer';when month >=7 and month<=9 thenset season='autumn';when month >=10 and month<=12 thenset season='winter';end case;
end ;call test8(9,@season);            -- 定义会话变量来接收test8存储过程返回的值select @season;

15.3.5 while循环

  • 需求

计算任意数的累加和

CREATE PROCEDURE test10 (in count int)
begindeclare total int default 0;declare i int default 1;while i<=count doset total=total+i;set i=i+1;end while;select total;
end ;call test10(10);

15.3.6 repeat循环

计算任意数的累加和

CREATE PROCEDURE test11 (count int)      -- 默认是输入(in)参数
begindeclare total int default 0;repeat set total=total+count;set count=count-1;until count=0               -- 结束条件,注意不要打分号end repeat;select total;
end ;call test11(10);

15.3.7 loop循环

计算任意数的累加和

CREATE PROCEDURE test12 (count int)      -- 默认是输入(in)参数
begindeclare total int default 0;   sum:loop                            -- 定义循环标识set total=total+count;set count=count-1;if count < 1 thenleave sum;                  -- 跳出循环end if;end loop sum;                     -- 标识循环结束select total;end ;call test12(10);

15.3.8 游标

游标是用来存储查询结果集的数据类型,可以帮我们保存多条行记录结果,我们要做的操作就是读取游标中的数据获取每一行的数据。

  • 声明游标
declare cursor_name cursor for statement;
  • 打开游标
open cursor_name;
  • 读取游标
fetch cursor_name;
  • 关闭游标
close cursor_name;
  • 案例:
CREATE PROCEDURE test13 ()       -- 默认是输入(in)参数
begindeclare id int(11);declare `name` varchar(20);declare class_id int(11);-- 定义游标结束标识符declare has_data int default 1;declare stu_result cursor for select * from student;-- 监测游标结束declare exit handler for not found set has_data=0;-- 打开游标open stu_result;repeat fetch stu_result into id,`name`,class_id;select concat('id: ',id,';name: ',`name`,';class_id',class_id);until has_data=0      -- 退出条件,注意不要打分号end repeat;-- 关闭游标close stu_result;end ;call test13();

15.4 存储过程和存储函数的区别

  • 存储函数的限制比较多,例如不能用临时表、不能执行查询语句、只能用表变量等;而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。

  • 返回值不同。存储函数必须有返回值,且仅返回一个结果值;存储过程可以没有返回值,但是能返回结果集(out,inout)。

  • 调用时的不同。存储函数嵌入在SQL中使用,可以在select 存储函数名(变量值);存储过程通过call语句调用 call 存储过程名。

  • 参数的不同。存储函数的参数类型类似于IN参数,没有类似于OUT和INOUT的参数。存储过程的参数类型有三种,in、out和inout:

    • in: 数据只是从外部传入内部使用(值传递),可以是数值也可以是变量
    • out: 只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量
    • inout: 外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量。

  • 创建一个普通的存储函数:
create function test1()
returns int
begindeclare num int default 0;set num=10;return num;
end;
  • 执行存储函数:
select test1()
  • 创建一个有参数的存储函数:
create function test2(num int)
returns int
beginreturn num;
end;
  • 执行存储函数:
select test2(10);

15【存储过程和存储函数】相关推荐

  1. 【宋红康 MySQL数据库】【基础版】【15】存储过程与存储函数

    文章目录 存储过程与存储函数 定义存储过程与存储函数 对比存储函数和存储过程 存储过程概述 理解 分类 创建存储过程 语法分析 代码举例 调用存储过程 调用格式 代码举例 如何调试 存储函数的使用 语 ...

  2. 第15章_存储过程与函数(创建存储过程、调用存储过程、存储函数的使用、存储过程和函数的查看、修改、删除)

    第15章_存储过程与函数 第15章_存储过程与函数 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 2.1 语法分析 2.2 代码举例 3. 调用存储过程 3.1 调用格式 3.2 ...

  3. (第15章 存储过程与存储函数)

    #第15章_存储过程与存储函数#0.准备工作CREATE DATABASE dbtest15;USE dbtest15;CREATE TABLE employees AS SELECT * FROM ...

  4. MySQL初级篇——存储过程、存储函数的相关概念及应用举例

    文章目录: 1.什么是存储过程? 2.存储过程操作相关SQL 3.存储过程实操SQL 4.存储函数操作相关SQL 5.存储函数实操SQL 6.存储过程.存储函数的优缺点 1.什么是存储过程? 含义:存 ...

  5. MySQL存储过程与存储函数

    1.创建存储过程 存储过程就是一条或者多条 SQL 语句的集合,可以视为批文件.它可以定义批量插入的语句,也可以定义一个接收不同条件的 SQL. 创建存储过程的语句为 "create pro ...

  6. MySQL(六)——存储过程和存储函数

    前言 今天简单的介绍一下"存储函数"和"存储过程",平时在工作中用到的时间不多,时间长了难免会忘记.在这里简单的做个回忆总结,方便自己以后复习回忆,当然能帮到需 ...

  7. MySQL【存储过程与存储函数】

    #第15章_存储过程与存储函数 #0.准备工作 CREATE DATABASE dbtest15; USE dbtest15; CREATE TABLE employees AS SELECT * F ...

  8. MySQL学习笔记 05、触发器、存储过程、存储函数、定时任务

    文章目录 前言 一.触发器 提前准备测试表 1.1.创建触发器 1.2.删除触发器 二.存储过程 2.1.认识变量 2.1.1.系统变量 2.1.2.用户变量 2.2.存储过程创建 2.3.删除存储过 ...

  9. MySQL学习笔记(2)——存储过程与存储函数

    MySQL学习笔记(2)--存储过程与存储函数 文章目录 MySQL学习笔记(2)--存储过程与存储函数 一.存储过程 1.概念:预先编译好的sql语句的集合,理解成批处理语句 2.好处: 3.语法: ...

最新文章

  1. 还原dede数据后系统基本参数空白无显示的解决方法
  2. 设置居中_微信设置个性签名居中,超简单!
  3. 通过webpack配置vue项目页面title
  4. 【Linux系统编程】互斥锁
  5. java也可以做黑客?
  6. lora无线通信模块LoRa技术在智能家居灯控上的应用
  7. 4、Flutter 采坑记录篇二_依赖库不兼容
  8. python正则表达式group用法_【Python】正则表达式用法
  9. 手机MODEM开发(31)---LTE 速率低
  10. 为什么我的modbus tcp server只能连一个client_TCP 协议概览
  11. Spring IOC学习心得之Bean对IOC容器的感知
  12. _软件园三期西片区F地块举行招商推介会 超300家企业意向落户 - 本网原创
  13. matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
  14. paip.验证码识别---序列号的反转
  15. 互联网日报 | 前11月全国网购超10万亿元;B站8月月活首次突破2亿;华为Mate40标准版开启预售...
  16. 2.reflect.TypeOf()
  17. 数据库学习-三种异常
  18. Windows支持WGET命令
  19. 假如小明今年第1季度的三个月中的营业额分别是{5,10,15},第二季度他计划要把第1季度中每个月的营业额都提升为2倍,请你帮小明同学计算出他第二季度的每个月营业额;
  20. iApp开发彩虹易支付APP源码+支持大多数

热门文章

  1. 不放心的dblink--手工关闭dblink
  2. Zigzag小整数压缩算法
  3. 使用JMS进行消息传递
  4. IPTV系统云桌面管理:开机广告+三方apk管理+图文介绍
  5. UBOOT移植详细 很全面
  6. 安装使用Animate动画库【Animate.css下载安装教程】
  7. 福州大学计算机学硕分数,2021年福州大学考研录取分数线应该在哪里查询?
  8. yishaadmin,yishaadmin修改数据后回到起始页的解决办法,保持在修改前的页码,分页组件在修改数据后不返回到第一页
  9. Android 报错Failed to load native library: XXXX_so
  10. 分布式矩阵和分布式kvm的区别