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

目录

  • 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)
beginset 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)
begindeclare i int default(1);while i <= n doinsert 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))
begindeclare usercount int;select count(*) into usercountfrom userwhere `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:

CASEWHEN 条件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)
beginselect count(*) into countfrom scorewhere 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)
begindeclare did int;  # 部门编号declare lid int;  # 课程编号select department.id into didfrom departmentwhere department.`name` = dname;select lesson.lessonid into lidfrom lessonwhere lesson.lessonName = lname;update scoreset score.score = score.score + addscorewhere stuid in(select stu.idfrom stuwhere stu.departmentId = did) and LessonId = lid;end$
delimiter ;# 加分前的数学成绩表
# 注意这里的成绩表不止是数学学院的数学成绩哦,还有别的学院的同学,而我们只对数学学院的同学进行加分 ^_^
select score.score from scorewhere LessonId = '101';call p_updatescore('数学学院', '数学', 1);# 加分后的数学成绩表
select score.score from scorewhere LessonId = '101';

参考书籍

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

web:[极客大挑战 2019]LoveSQL

题目 打开页面显示如下 查看源代码&#xff0c;查到一个check.php&#xff0c;还是get传参 尝试账号密码输入 题目名为sql&#xff0c;用万能密码 1or 11# 或 admin or 11 给了一段乱码&#xff0c;也不是flag 查看字段数 /check.php?usernameadmin order by 3%23&pass…

PDF文件超出上传大小?三分钟学会PDF压缩

PDF作为一种流行的文档格式&#xff0c;被广泛用于各种场合&#xff0c;然而有时候PDF文件的大小超出了上传限制&#xff0c;这时候我们就需要采取一些措施来减小PDF文件的大小&#xff0c;下面就给大家分享几个方法&#xff0c;一起来学习下吧~ 方法一&#xff1a;嗨格式压缩大…

Acer宏碁笔记本暗影骑士轻刃AN715-51原装出厂Windows10系统工厂模式镜像

系统自带所有驱动、NITROSENSE风扇键盘灯控制中心、Office办公软件、出厂主题壁纸、系统属性Acer宏基专属的LOGO标志、 Acer Care Center、Quick Access等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1FDCP5EONlk0o12CYFXbhrg?pwdvazt 所需要工具&#xff1a;32G…

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…

网络基础(了解网络知识的前提)

前言 在正式学习网络之前&#xff0c;我们需要了解的一些关于计算机网络的基本知识&#xff0c;本文主要阐述这些基本知识&#xff0c;带着大家一步一步迈进互联网网络的世界&#xff1b; 一、局域网与广域网的概念 在正式了解这些概念的前提是我们要搞懂网络出现的意义&#x…

Uniapp实现APP云打包

一. 基础配置 二. APP图标配置 1. 点击浏览 选取图标(注&#xff1a;图片格式为png) 2. 点击自动生成所有图标并替换 三. 点击发行 并选择云打包 四. 去开发者中心获取证书 我这里是已经获取好的&#xff0c;没有获取的话&#xff0c;按照提示获取即可&#xff0c;非常简单…

Ubuntu系统Linux内核安装和使用

安装&#xff1a; 检查树莓派Linux版本&#xff0c;我的是6.1 uname -r 内核下载链接&#xff1a; Raspberry Pi GitHub 找对应版本下载 导入之后&#xff0c;解压安装即可 unzip linux-rpi-6.1.y.zip 其他内容 treee 指令安装 sudo apt-get install tree 使用这…

【ICCV 2023 Oral】High-Quality Entity Segmentation分享

为什么会看这篇文章呢&#xff1f;因为要搞所谓分割大模型&#xff0c;为什么要搞分割大模型&#xff0c;因为最终我们要搞得是&#xff0c;业内领先的全自动标注系统。&#xff08;标完都不需要人工再修正&#xff01;&#xff01;&#xff01;&#xff09; OK&#xff0c;仰…

JavaScript系列从入门到精通系列第十篇:JavaScript中的相等运算符与条件运算符

文章目录 一&#xff1a;相等运算符 1&#xff1a; 2&#xff1a;! 3&#xff1a;与! (一)&#xff1a; (二)&#xff1a;! 二&#xff1a;条件运算符 1&#xff1a;语法 2&#xff1a;使用 3&#xff1a;容易挨打的写法 一&#xff1a;相等运算符 用于比较两个值是…

No151.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…

最新AI智能写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络)

多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络) 目录 多维时序 | MATLAB实现PSO-BP多变量时间序列预测(粒子群优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-BP粒子群优化BP神经网络多变量时间序列预测&#xff…

《YOLOv5:从入门到实战》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLOv5&#xff1a;从入门到实战》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇专…

QT6.5.2编译PostgreSql驱动

一、环境 1、操作系统&#xff1a;win11 2、qt版本&#xff1a;6.5.2 3、PostgreSql版本:14.9 二、下载qbase源码 1、下载地址&#xff1a;https://github.com/qt/qtbase/tree/6.5.2 将下载的源码文件解压指定的的目录&#xff0c;找到src/plugins/sqldrivers根据自己的实…

2023年【安徽省安全员C证】模拟考试题及安徽省安全员C证实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【安徽省安全员C证】模拟考试题及安徽省安全员C证实操考试视频&#xff0c;包含安徽省安全员C证模拟考试题答案和解析及安徽省安全员C证实操考试视频练习。安全生产模拟考试一点通结合国家安徽省安全员C证考试最…

Three.js加载360全景图片/视频

Three.js加载360全景图片/视频 效果 原理 将全景图片/视频作为texture引入到three.js场景中将贴图与球形网格模型融合&#xff0c;将球模型当做成环境容器使用处理视频时需要以dom为载体&#xff0c;加载与控制视频动作每次渲染时更新当前texture&#xff0c;以达到视频播放效…

Jenkins 权限管理

关于Role-based Authorization Strategy 使用Jenkins自身的权限管理过于粗糙&#xff0c;无法对单个、一类项目做管理&#xff0c;我们可以使用 Role-based Authorization Strategy插件来管理项目、角色。 首先安装该插件&#xff1a;在Jenkins查看该插件有无安装 在Jenkins-…

基于css变量轻松实现网站的主题切换功能

我们经常看到一些网站都有主题切换&#xff0c;例如vue官方文档。那他是怎么实现的呢&#xff1f; 检查元素&#xff0c;发现点击切换时&#xff0c;html元素会动态的添加和移除一个class:dark&#xff0c;然后页面主题色就变了。仔细想想&#xff0c;这要是放在以前&#xff0…