【数据库——MySQL】(12)过程式对象程序设计——存储过程

news2024/12/23 14:19:28

目录

  • 1. 存储过程
  • 2. 局部变量
  • 3. 条件分支
    • 3.1 IF 语句
    • 3.2 CASE 语句
  • 4. 循环语句
    • 4.1 WHILE 语句
    • 4.2 REPEAT 语句
    • 4.3 LOOP和LEAVE语句
    • 4.4 LOOP和ITERATE语句
  • 5. 存储过程应用示例
  • 参考书籍

1. 存储过程

  1. 创建存储过程,需要用到 CREATE 语句:

    CREATE PROCEDURE 存储过程名()
    BEGIN
    		存储过程体
    END ; 
    
  2. 调用存储过程,需要用到 CALL 语句:

    CALL 存储过程名();
    
  3. 修改存储过程,需要用到 ALTER 语句:

    ALTER PROCEDURE 存储过程名 
    [
    	COMMENT 'string'
    	| LANGUAGE SQL
    	| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    	| SQL SECURITY { DEFINER | INVOKER }
    }
    
  4. 删除存储过程,需要用到 ALTER 语句:

    DROP PROCEDURE [IF EXISTS] 存储过程名
    

2. 局部变量

在过程体中可以使用 DECLARE 语句声明局部变量,用来存储临时的结果。它仅允许出现在 BEGIN...END 语句内部,且必须在所有其他语句之前。

语法格式:

DECLARE 变量名,... 类型 [DEFAULT]

局部变量可以通过 SET 语句赋值和 SELECT 语句显示。

SET 变量名 =, ...
SELECT 变量名, ...

【例】给局部变量赋值例子。

set @a=1;
select count(*) into @c from stu;

select @a, @c;

【例】创建存储过程 p4 输出平方数。

drop PROCEDURE if EXISTS p4;
# delimiter可以设置结束符,如经过下面设置后结束符为$,不是;
delimiter $
# inout : 先输入,再输出参数
create procedure p4(inout a int, inout b int)
begin
	set a=a*a;
	set b=b*b;
end$
delimiter ;

set @a=3;
set @b=4;
call p4(@a, @b);
select @a, @b;

【例】在一个存储过程 p2 中声明局部变量,显示登录用户是“合法用户”还是“非法用户”。

先自行创建一张表 user,内容如下(手动输入或者通过存储过程添加数据都可,id 可以和下面的图片不一样):

在这里插入图片描述

同样可以用存储过程 p1 添加数据:

# 创建存储过程(循环创建)
drop PROCEDURE if EXISTS p1;
# delimiter可以设置结束符,如经过下面设置后结束符为$,不是;
delimiter $
create procedure p1(in n int)
begin
	declare i int default(1);
	while i <= n do
		insert into user values (null, concat('user', i), '12345');
		set i = i + 1;
	end while;
	
end$
delimiter ;
call p1(10);     # 运行过程p1,加入数据

判断用户状态的存储过程 p2

CREATE DEFINER=`root`@`localhost` PROCEDURE `p2`(in uname char(20), in psword char(20))
begin
	declare usercount int;
	select count(*) into usercount
	from user
	where `username` = uname and `password` = psword;
	select if(usercount > 0, '合法用户', '非法用户');
end

:DEFINER=`root`@`localhost` 是指定了一个 MySQL 帐户,

执行存储过程:

call p2('user1', '12345');
call p2('user1', '123456');

在这里插入图片描述

3. 条件分支

3.1 IF 语句

语法格式:

IF 条件1 THEN 
	语句序列1
[ELSEIF 条件2 THEN 
	语句序列2] 
...
[ELSE 
	语句序列0]
END IF

3.2 CASE 语句

语法格式 1:

CASE 表达式
	WHEN1 THEN 语句序列1
	[WHEN2 THEN 语句序列2] 
	...
	[ELSE 语句序列0]
END CASE

语法格式 2:

CASE
	WHEN 条件1 THEN 语句序列1
	[WHEN 条件2 THEN 语句序列2] 
	...
	[ELSE 语句序列0]
END CASE

4. 循环语句

4.1 WHILE 语句

WHILE 语句是先判断条件再执行语句
语法格式:

WHILE 条件 DO
	语句序列
END WHILE

4.2 REPEAT 语句

REPEAT 语句是先执行语句序列再判断条件
语法格式:

REPEAT
	语句序列
UNTIL 条件 END REPEAT

4.3 LOOP和LEAVE语句

LOOPLEAVE 语句是通过语句体控制循环结束
语法格式:

[标签:] LOOP
	语句序列
	LEAVE标签
	...
END LOOP [标签]

4.4 LOOP和ITERATE语句

LOOPITERATE 语句是跳转到循环开始
WHILEREPEATLOOP 循环体内执行到 ITERATE 语句,就跳转到循环开始继续执行。

ITERATE 标签

ITERATE 语句与 LEAVE 区别在于,LEAVE 是离开一个循环,而 ITERATE 语句则是重新开始一个循环。

5. 存储过程应用示例

【例 1】创建存储过程 p3 输出数据库 score 中的表 score 中成绩大于等于 90 的人数。

:数据库 score 在前面的习题讲解中已创建!

drop PROCEDURE if EXISTS p3;
# delimiter可以设置结束符,如经过下面设置后结束符为$,不是;
delimiter $
# out : 输出参数
create procedure p3(out count int)
begin
	select count(*) into count
	from score
	where score.score >= 90;
end$
delimiter ;

set @c=1;
call p3(@c);
select @c;

【例 2】编写存储过程 p_updatescore,将某个学院的所有学生的某门功课成绩+n,然后调用该存储过程,将数学学院的学生数学成绩+1

drop procedure if exists p_updatescore;
delimiter $
create procedure p_updatescore(in dname char(20), in lname char(20), in addscore int)
begin
	declare did int;  # 部门编号
	declare lid int;  # 课程编号
	
	select department.id into did
			from department
			where department.`name` = dname;
		
	select lesson.lessonid into lid
			from lesson
			where lesson.lessonName = lname;
		
	update score
	set score.score = score.score + addscore
	where stuid in
	(
			select stu.id
					from stu
					where stu.departmentId = did) and LessonId = lid;
	
end$
delimiter ;

# 加分前的数学成绩表
# 注意这里的成绩表不止是数学学院的数学成绩哦,还有别的学院的同学,而我们只对数学学院的同学进行加分 ^_^
select score.score 
		from score
		where LessonId = '101';

call p_updatescore('数学学院', '数学', 1);

# 加分后的数学成绩表
select score.score 
		from score
		where LessonId = '101';

参考书籍

《MySQL实用教程(第4版)》

上一篇文章:【数据库——MySQL】(11)查询和视图练习及讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卸载无用Mac电脑软件应用程序方法教程

如何在Mac电脑卸载应用程序&#xff1f;Mac OS系统的用户卸载软件时&#xff0c;大部分会选择直接将软件图标拖进废纸篓清倒。这种操作会留下大量程序残余文件占据磁盘空间&#xff0c;手动清理又怕误删文件&#xff0c;有时还会遇到无法移除的恶意/流氓软件。小编今天分享3种可…

端口被占用怎么解决

第一步&#xff1a;WinR 打开命令提示符&#xff0c;输入netstat -ano|findstr 端口号 找到占用端口的进程 第二步&#xff1a; 杀死使用该端口的进程&#xff0c;输入taskkill /t /f /im 进程号&#xff08; &#xff01;&#xff01;&#xff01;注意是进程号&#xff0c;不…

分布式文件系统FastDFS实战

1. 分布式文件系统应用场景 互联网海量非结构化数据的存储需求&#xff1a; 电商网站&#xff1a;海量商品图片视频网站&#xff1a;海量视频文件网盘&#xff1a;海量文件社交网站&#xff1a;海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1简介 …

Spring Boot中配置文件介绍及其使用教程

目录 一、配置文件介绍 二、配置简单数据 三、配置对象数据 四、配置集合数据 五、读取配置文件数据 六、占位符的使用 一、配置文件介绍 SpringBoot项目中&#xff0c;大部分配置都有默认值&#xff0c;但如果想替换默认配置的话&#xff0c;就可以使用application.prop…

Unity如何实现TreeView

前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…

react create-react-app v5配置 px2rem (暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 我这个方式是 npm run eject 暴露 webpack配置的方法 1.安装 postcss-plugin-px2rem 和 lib-flexible cnpm install postcss-plugin-px2rem…

RV1126笔记四十一:RV1126移植LIVE555

若该文为原创文章,转载请注明原文出处。 RV1126的SDK有提供了一个librtsp.a封装好的RTSP推流库,但不开源,还有个确定延时长,所以想自己写一个RTSP的推流,但不想太麻烦,所以使用Live555。 记录下移植过程和测试结果。 live555需要用到的包有 openssl 和live555 一、 编…

基于SpringBoot的服装生产管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录界面的实现 系统主界面的实现 用户管理模块的实现 人事安排管理模块的实现 工资管理模块的实现 考勤管理模块的实现 样板管理模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本协力服装厂服装生…

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)

随着技术的不断进步&#xff0c;现场服务组织正朝着远程支持转变&#xff0c;用以解决技能差距和生产力问题&#xff0c;提高员工培训和操作效率&#xff0c;同时为企业提高利润率&#xff0c;创造竞争优势。 本文将探讨增强现实&#xff08;AR&#xff09;、辅助现实&#xf…

后台管理系统: 商品管理

商品管理之三级联动静态组件 先做俩个卡片组件&#xff0c;分开距离 三级联动很多地方都用到了它&#xff0c;我们可以封装成一个组件 注册为一个全局组件 <div><el-form :inline"true" class"demo-form-inline"><el-form-item label&qu…

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…

Idea引入thymeleaf失败解决方法

报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Fri Sep 29 09:42:00 CST 2023 There was an unexpected error (typeNot Found, status404). 原因&#xff1a;html没有使用thymeleaf 首先要引入…

pmp考试有包过班吗?靠谱吗?

PMP考试是全球范围内最为知名和认可的项目管理专业认证考试之一。对于想要在项目管理领域取得突破和进步的人来说&#xff0c;PMP认证是非常重要的一项资格。然而&#xff0c;对于很多考生来说&#xff0c;他们可能会关心一个问题&#xff1a;PMP考试有包过班吗&#xff1f;靠谱…

四川玖璨电子商务有限公司抖音培训引领电商新潮

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;抖音这个社交媒体平台也逐渐成为了商家必争之地。四川玖璨电子商务有限公司抖音培训&#xff0c;为你解锁电商流量密码&#xff0c;助你一飞冲天&#xff01; 一、抖音电商&#xff1a;下一个电商蓝海 作为拥有海量用户的…

操作系统相关杂项

系列文章目录 文章目录 系列文章目录前言一、dlopen, dlerror, dlclose直接执行动态库中的某个函数/某段代码 Linux共享库的组织共享库的构造和析构函数 动态链接堆栈初始化C全局构造与析构模拟实现库函数 freadsyscallsyscall 原理基于int的Linux的经典系统调用实现 前言 一、…

idea Springboot 图书管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 图书管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#…

基于Java实现的民宿预订管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

yolox相关

yolox YOLOXYOLOX-DarkNet53yolov3作为baseline输入端Strong data augmentationMosaic数据增强MixUp数据增强注意 BackboneNeckPrediction层Decoupled headDecoupled Head 细节 Anchor-freeAnchor Based方式Anchor Free方式标签分配初步筛选精细化筛选 SimOTASimOTA Other Back…

Thymeleaf快速入门(Spring版)

文章目录 Thymeleaf快速入门&#xff08;Spring版&#xff09;1、Thymeleaf概述2、Thymeleaf快速入门3、Thymeleaf基础语法3.1 th属性3.2 标准表达式语法3.2.1 变量表达式3.2.2 选择表达式3.2.3 URL表达式3.2.3 链接表达式3.2.4 国际化表达式3.2.5 片段引用表达式 Thymeleaf快速…