iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL-SQL存储过程/触发器详解(下)
  • 327
分享到

MySQL-SQL存储过程/触发器详解(下)

sqlmysql数据库 2023-09-01 07:09:32 327人浏览 泡泡鱼
摘要

♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会

♥️作者:小刘在C站

♥️个人主页: 小刘主页 

♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!

♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术

♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇!

前言

上章讲到MySQL-SQL存储过程/触发器详解(上)本章继续

目录

1.4 if

1). 介绍

2). 案例

1.4.1参数

1). 介绍

 用法:

2). 案例一

3). 案例二

1.4.2 case

1). 介绍

语法2:

2). 案例

1.4.3while

1). 介绍

2). 案例

1.4.4repeat

1). 介绍

2). 案例

1.4.5 loop

1). 介绍

2). 案例一

3). 案例二

1.4.6

1). 介绍

A. 声明游标

B. 打开游标

C. 获取游标记录

D. 关闭游标

2). 案例

1.4.7条件处理程序

1). 介绍

2). 案例


1.4 if

1). 介绍

if 用于做条件判断,具体的语法结构为:
IF 条件1 THEN.....ELSEIF 条件2 THEN -- 可选.....ELSE -- 可选.....END IF;
if 条件判断的结构中, ELSE IF 结构可以有多个,也可以没有。 ELSE 结构可以有,也可以没有。

2). 案例

根据定义的分数 score 变量,判定当前分数对应的分数等级。 score >= 85 分,等级为优秀。 score >= 60 分 且 score < 85 分,等级为及格。 score < 60 分,等级为不及格。
create procedure p3()begindeclare score int default 58;declare result varchar(10);if score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;select result;end;call p3(); 
上述的需求我们虽然已经实现了,但是也存在一些问题,比如: score 分数我们是在存储过程中定义死的,而且最终计算出来的分数等级,我们也仅仅是最终查询展示出来而已。 那么我们能不能,把 score 分数动态的传递进来,计算出来的分数等级是否可以作为返回值返回呢?答案是肯定的,我们可以通过接下来所讲解的 参数 来解决上述的问题。 、

1.4.1参数

1). 介绍

参数的类型,主要分为以下三种: IN OUT INOUT 。 具体的含义如下:

 用法:

CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ])BEGIN-- sql语句END ;

2). 案例一

根据传入参数 score ,判定当前分数对应的分数等级,并返回。 score >= 85 分,等级为优秀。 score >= 60 分 且 score < 85 分,等级为及格。 score < 60 分,等级为不及格。
create procedure p4(in score int, out result varchar(10))beginif score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;end;-- 定义用户变量 @result来接收返回的数据, 用户变量可以不用声明call p4(18, @result);select @result;

3). 案例二

将传入的200分制的分数,进行换算,换算成百分制,然后返回。
create procedure p5(inout score double)beginset score := score * 0.5;end;set @score = 198;call p5(@score);select @score;

1.4.2 case

1). 介绍

case 结构及作用,和我们在基础篇中所讲解的流程控制函数很类似。有两种语法格式: 语法 1
-- 含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时,执行statement_list2, 否则就执行 statement_listCASE case_valueWHEN when_value1 THEN statement_list1[ WHEN when_value2 THEN statement_list2] ...[ ELSE statement_list ]END CASE;

语法2

-- 含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成立时,执行statement_list2, 否则就执行 statement_listCASEWHEN search_condition1 THEN statement_list1[WHEN search_condition2 THEN statement_list2] ...[ELSE statement_list]END CASE;

2). 案例

根据传入的月份,判定月份所属的季节(要求采用 case 结构)。 1-3 月份,为第一季度 4-6 月份,为第二季度 7-9 月份,为第三季度 10-12 月份,为第四季度
create procedure p6(in month int)begindeclare result varchar(10);casewhen month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := '第三季度'; when month >= 10 and month <= 12 thenset result := '第四季度';elseset result := '非法参数';end case ;select concat('您输入的月份为: ',month, ', 所属的季度为: ',result);end;call p6(16);
如果判定条件有多个,多个条件之间,可以使用 and or 进行连接。

1.4.3while

1). 介绍

while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的 SQL 语句。具体语法为:
-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑WHILE 条件 DOSQL逻辑...END WHILE;

2). 案例

计算从 1 累加到 n 的值, n 为传入的参数值。
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行减1 , 如果n减到0, 则退出循环create procedure p7(in n int)begindeclare total int default 0;while n>0 doset total := total + n;set n := n - 1;end while;select total;end;call p7(100);

1.4.4repeat

1). 介绍

repeat 是有条件的循环控制语句 , 当满足 until 声明的条件的时候,则退出循环 。具体语法为:
-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环REPEATSQL逻辑...UNTIL 条件END REPEAT;

2). 案例

计算从 1 累加到 n 的值, n 为传入的参数值。 ( 使用 repeat 实现 )
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环create procedure p8(in n int)begindeclare total int default 0;repeatset total := total + n;set n := n - 1;until n <= 0end repeat;select total;end;call p8(10);call p8(100);

1.4.5 loop

1). 介绍

LOOP 实现简单的循环,如果不在 SQL 逻辑中增加退出循环的条件,可以用其来实现简单的死循环。 OOP 可以配合一下两个语句使用: LEAVE :配合循环使用,退出循环。 ITERATE :必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
[begin_label:] LOOPSQL逻辑...END LOOP [end_label]; 
LEAVE label; -- 退出指定标记的循环体ITERATE label; -- 直接进入下一次循环
上述语法中出现的 begin_label end_label label 指的都是我们所自定义的标记。

2). 案例一

计算从 1 累加到 n 的值, n 为传入的参数值。
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xxcreate procedure p9(in n int)begindeclare total int default 0;sum:loopif n<=0 thenleave sum;end if;set total := total + n;set n := n - 1;end loop sum;select total;end;call p9(100);

3). 案例二

计算从 1 n 之间的偶数累加的值, n 为传入的参数值。
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xx-- C. 如果当次累加的数据是奇数, 则直接进入下一次循环. --------> iterate xxcreate procedure p10(in n int)begindeclare total int default 0;sum:loopif n<=0 thenleave sum;end if;if n%2 = 1 thenset n := n - 1;iterate sum;end if;set total := total + n;set n := n - 1;end loop sum;select total;end;call p10(100);

1.4.6

1). 介绍

游标( CURSOR )是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、 OPEN FETCH CLOSE ,其语法分别如下。 x

A. 声明游标

DECLARE 游标名称 CURSOR FOR 查询语句 ;

B. 打开游标

OPEN 游标名称 ;

C. 获取游标记录

FETCH 游标名称 INTO 变量 [, 变量 ] ;

D. 关闭游标

CLOSE 游标名称 ;

2). 案例

根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名 name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表 (id,name,profession) 中。
-- 逻辑:-- A. 声明游标, 存储查询结果集-- B. 准备: 创建表结构-- C. 开启游标-- D. 获取游标中的记录-- E. 插入数据到新表中-- F. 关闭游标create procedure p11(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <=uage;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p11(30);
上述的存储过程,最终我们在调用的过程中,会报错,之所以报错是因为上面的 while 循环中,并没有退出条件。当游标的数据集获取完毕之后,再次获取数据,就会报错,从而终止了程序的执行。

 

但是此时, tb_user_pro 表结构及其数据都已经插入成功了,我们可以直接刷新表结构,检查表结构中的数据。

 

上述的功能,虽然我们实现了,但是逻辑并不完善,而且程序执行完毕,获取不到数据,数据库还报错。 接下来,我们就需要来完成这个存储过程,并且解决这个问题。 要想解决这个问题,就需要通过 Mysql 中提供的 条件处理程序 Handler 来解决。

1.4.7条件处理程序

1). 介绍

条件处理程序( Handler )可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:
DECLARE handler_action HANDLER FOR condition_value [, condition_value]... statement ;handler_action 的取值:CONTINUE: 继续执行当前程序EXIT: 终止执行当前程序condition_value 的取值:SQLSTATE sqlstate_value: 状态码,如 02000SQLWARNING: 所有以01开头的SQLSTATE代码的简写NOT FOUND: 所有以02开头的SQLSTATE代码的简写SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写

2). 案例

我们继续来完成在上一小节提出的这个需求,并解决其中的问题。 根据传入的参数 uage ,来查询用户表 tb_user 中,所有的用户年龄小于等于 uage 的用户姓名 name )和专业( profession ),并将用户的姓名和专业插入到所创建的一张新表 (id,name,profession) 中。 A. 通过 SQLSTATE 指定具体的状态码
-- 逻辑:-- A. 声明游标, 存储查询结果集-- B. 准备: 创建表结构-- C. 开启游标-- D. 获取游标中的记录-- E. 插入数据到新表中-- F. 关闭游标create procedure p11(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <=uage;-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出declare exit handler for SQLSTATE '02000' close u_cursor;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p11(30);
B. 通过 SQLSTATE 的代码简写方式 NOT FOUND 02 开头的状态码,代码简写为 NOT FOUND
create procedure p12(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <=uage;-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02开头时,将关闭游标u_cursor,并退出declare exit handler for not found close u_cursor;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p12(30);

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家

来源地址:https://blog.csdn.net/lzl10211345/article/details/131353327

您可能感兴趣的文档:

--结束END--

本文标题: MySQL-SQL存储过程/触发器详解(下)

本文链接: https://www.lsjlt.com/news/387685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL-SQL存储过程/触发器详解(下)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-09-01
    sql mysql 数据库
  • MySQL-SQL存储函数以及触发器详解
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-09-04
    mysql sql 数据库
  • 怎么理解MySQL存储过程和触发器
    这期内容当中小编将会给大家带来有关怎么理解MySQL存储过程和触发器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。存储过程(stored procedure SP)是My...
    99+
    2024-04-02
  • MySQL存储过程详解 mysql 存储过程
    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Proce...
    99+
    2024-04-02
  • 【MySQL进阶教程】视图/存储过程/触发器
    前言 本文为 【MySQL进阶教程】视图/存储过程/触发器 相关知识,下边将对视图,存储过程,存储函数,触发器等进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Ja...
    99+
    2023-09-18
    mysql 数据库 java
  • MySQL触发器使用过程详解
    目录mysql—触发器创建触发器查看触发器删除触发器触发器优缺点MySQL—触发器 ​ 将两个关联的操作步骤写到程序里面,并且要用事务包裹起来,确保两个操作称为一个原子操作,要么全部执行,要么全部...
    99+
    2023-03-01
    MySQL触发器怎么用 MySQL触发器
  • MySQL系列之五 视图、存储函数、存储过程、触发器
    目录系列教程一、视图 1、视图的创建 2、查看视图定义 3、删除视图 二、存储函数 1、系统函数 2、自定义函数(user-defined function:UDF) 三、存储过程 ...
    99+
    2024-04-02
  • mysql 存储过程详解
    前言 在项目开发中,经常会遇到这样一种场景,当修改A表的一条数据时,需要关联修改B表、C表甚至其他更多表的数据,为什么会这样呢? 在真实的业务场景中,往往一张表的数据关联的业务是多样的,举例来说,用户在页面上完成一个订单,对服务端来说,与这...
    99+
    2023-08-17
    mysql 存储过程详解 mysql 存储过程使用 mysql 存储过程
  • oracle 存储过程、函数和触发器用法实例详解
    本文实例讲述了oracle 存储过程、函数和触发器用法。分享给大家供大家参考,具体如下: 一、存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。 创建存储过程 用CREAT...
    99+
    2024-04-02
  • SQL Server中函数、存储过程与触发器怎么用
    这篇文章主要讲解了“SQL Server中函数、存储过程与触发器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server中函数、存储过程与触发器怎么用”吧...
    99+
    2023-06-29
  • SQL Server的存储过程详解
    目录存储过程的概念存储过程的优点系统存储过程用户自定义存储过程1、 创建语法2、 创建不带参数存储过程3、 修改存储过程4、 带参存储过程5、 带通配符参数存储过程6、 带输出参数存...
    99+
    2024-04-02
  • 在MySQL中如何使用存储过程和触发器
    在MySQL中,可以使用存储过程和触发器来实现一些特定的功能。下面分别介绍如何创建和使用存储过程和触发器: 存储过程: 存储过程...
    99+
    2024-04-09
    MySQL
  • SQL SERVER存储过程用法详解
    目录一、存储过程的概念存储过程的优点二、存储过程的分类1、系统存储过程2、临时存储过程3、用户自定义存储过程二、存储过程的用法1、不带参数的存储过程,获取MyStudentInfo表...
    99+
    2024-04-02
  • mysql转储/恢复存储过程和触发器指的是什么
    这篇文章将为大家详细讲解有关mysql转储/恢复存储过程和触发器指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL5.0首先介绍了存储过程和触发器。因此,...
    99+
    2024-04-02
  • 如何编写和执行MySQL存储过程和触发器
    编写和执行MySQL存储过程和触发器可以通过MySQL客户端或者通过SQL脚本来实现。以下是详细的步骤: 创建存储过程: DEL...
    99+
    2024-03-06
    MySQL
  • Mysql存储过程、触发器、事件调度器怎么使用
    本文小编为大家详细介绍“Mysql存储过程、触发器、事件调度器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql存储过程、触发器、事件调度器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。存...
    99+
    2023-06-28
  • MySQL中的视图、存储函数、存储过程、触发器分别是什么
    这篇文章主要讲解了“MySQL中的视图、存储函数、存储过程、触发器分别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的视图、存储函数、存储过程、触发器分别是什么”吧!目录一...
    99+
    2023-06-20
  • MYSQL存储过程 注释详解
    目录1.使用说明2.准备3.语法3.1 变量及赋值3.2 入参出参3.3 流程控制-判断3.4 流程控制-循环3.5 流程控制-退出、继续循环3.6 游标3.7 存储过程中的hand...
    99+
    2024-04-02
  • MySQL数据库的触发器和存储过程实例分析
    这篇文章主要介绍“MySQL数据库的触发器和存储过程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL数据库的触发器和存储过程实例分析”文章能帮助大家解决问题。一、实验目的掌握某主流D...
    99+
    2023-07-02
  • SQL SERVER触发器详解
    目录一、触发器的定义二、触发器分类三、创建触发器1、创建insert类型的触发器2、delete触发器3、update触发器4、instead of触发器DDL触发器触发器...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作