文章目录

  • 存储过程
  • 一、基本语法
    • (1)创建存储过程
    • (2)调用存储过程
    • (3)查看存储过程
    • (4)删除存储过程
    • (5)设置结束符
    • (6)参数
  • 二、变量
    • (1)系统变量
    • (2)用户自定义变量
    • (3)局部变量
  • 三、基本语句
    • (1)if判断
    • (2)case
    • (3)while循环
    • (4)repeat
    • (5)loop循环
  • 四、游标
  • 五、条件处理程序
  • 六、存储函数

存储过程

概念:

存储过程时事先编译并存储在数据库中的一段SQL语句的集合。

调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

特点:

  1. 封装,复用。
  2. 可以接收参数,也可以返回数据
  3. 减少网络交互,效率提升

一、基本语法

(1)创建存储过程

create procedure 存储过程名称([参数列表])
begin-- sql语句
end;

(2)调用存储过程

call 存储过程名称([参数列表])

(3)查看存储过程

-- 查询指定数据库的存储过程及状态信息
select * from information_schema.routines where routine_schema = 'xxx';-- 查询某个存储过程的定义
show create procedure 存储过程名称;
  • information_schema.routines:系统视图,存储了数据库中所有存储过程和函数的元数据。

  • routine_schema = 'xxx':过滤条件,xxx需替换为目标数据库名称,用于指定查询哪个数据库的存储过程。

(4)删除存储过程

drop procedure [if exists] 存储过程名称;l

(5)设置结束符

sql默认的结束符是分号;

但是存储过程中的SQL语句每一句结束都是分号;

导致存储过程无法正确执行。

这时候就需要修改结束的语句

delimiter $$

**但是自此以后,所有的sql语句都会需要$$**结束

CREATE PROCEDURE get_student(IN student_id INT)
BEGIN-- 内部SQL语句仍用;结束SELECT * FROM students WHERE id = student_id;SELECT COUNT(*) FROM scores WHERE student_id = student_id;
END $$  -- 这里用$$表示存储过程定义结束(与修改后的结束符一致)
#改回分号结束
delimiter ;

(6)参数

类型含义备注
in该类参数作为输入,也就是需要调用时传入值默认
out该类参数作为输出,也就是该参数可以作为返回值
inout既可以作为输入参数,可以作为输出参数
  1. in/out:

传值和返回值;

-- 案例
-- 1.根据传入参数score,判定当前分数对应的分数等级,并返回。
-- score >= 85分,等级为优秀。
-- score >= 60分 且 score < 85分,等级为优秀。
-- score < 60分,等级为优秀。
create procedure p1(in score int,out result varchar(10))
beginif score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;
end;call p4(60,@result);

之后 select @result 就是’及格’了

  1. inout:

即将传入的值进行加工,改变传入值

-- 案例
-- 2.将传入的200分制的分数,进行换算,换算成百分制,然后返回分数 ---> inout
create procedure p2(inout score double)
beginset score := score * 0.5;
end;set @score = 200;
call p5(@score);
select @score; -- 输出为100

二、变量

(1)系统变量

系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(global)、会话变量(seesion).

1.查看系统变量

不指定,默认选择session

show [session|global] variables;				-- 查看所有系统变量
show [session|global] variables like '......';	-- 可以通过like模糊匹配方式查找变量,如'auto%'
select @@[session|global].系统变量名;			 -- 查看指定变量的值

2.设置系统变量

设置系统变量后,重启服务器会重新变为默认值;

如果 不想消失需要在/etc/my.cnf中配置

set [session|global] 系统变量名 =;
set @@[session|global].系统变量名;

(2)用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用’@变量名‘使用就可以。其作用域为当前连接。

  • 赋值
set @变量名 =;
set @变量名 :=;select @变量名 :=;
select 字段名 into @变量名 from 表名;
  • 使用
select @变量名;

注意:

用户定义的变量无需对齐进行声明或初始化,只不过获取到的值为NULL。

(3)局部变量

局部变量是根据需要定义在局部生效的变量,访问之前,需要用declare声明。可用作存储过程内的局本变量和输入参数,局部变量的范围是在其内声明的begin…end块。

  • 声明
declare 变量名 变量类型[default...];

变量类型就是数据库字段类型:int、bigint、char、varchar、date、time等

  • 赋值
set 变量名 =;
set 变量名 :=;
select 字段名 into 变量名 from 表名...;
-- 例子
create procedure p1()
begindeclare stu_count int default 0;
end;

三、基本语句

(1)if判断

1.语法

if 条件1 then.....
elseif 条件2 then  -- 可选.....
else			   -- 可选.....
end if;

2.练习

-- 根据定义的分数score变量,判断当前分数对应的分数等级。
-- 1.score >= 85分,等级为优秀。
-- 2.score >= 60分 且 score < 85分,等级为优秀。
-- 3.score < 60分,等级为优秀create procedure p1()
begindeclare score int default 58;declare result varchar(10);if score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;select resultl;
end;

(2)case

1.语法

  • 语法一
case case_valuewhen when_value then 语句1;[when when_value then 语句2;][else 语句3];
end case;

when条件都不符合,就会进入else。

  • 语法二
casewhen 条件判断 then 语句1;[when 条件判断 then 语句2;][else 语句3];
end case;

2.练习

-- 根据传入的月份,判定月份所属的季节(要求采用case结构)。
-- 1.1-3月份,为第一季度
-- 2.4-6月份,为第二季度
-- 3.7-9月份,为第三季度
-- 4.10-12月份,为第四季度create procedure p1(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

(3)while循环

1.语法

while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。

-- 先判断条件,如果条件为true,则执行逻辑,否则,不执行逻辑
while 条件 doSQL逻辑....
end while;

2.练习

-- 计算1累加到n的值,n为传入的参数值。
create procedure p1(in n int)
begindeclare total int default 0;while n>0 doset total := total + n;set n := n - 1;end whileselect total;
end;

(4)repeat

1.语法

repeat是有条件的循环控制语句,当满足条件的时候退出循环。

-- 先执行一次逻辑,然后判断逻辑是否满足,如果满足,则退出。如果不满足,则继续下一次循环
repeatSQL逻辑....until 条件
end repeat;

2.练习

-- 计算1累加到n
create procedure p2(in n int)
begindeclare total int default 0;repeatset total := n + total;set n := n - 1;until n <= 0end repeat;select total;
end;

(5)loop循环

1.语法

loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其实现简单的死循环。

loop可以配合以下两个语句使用:

  • leave:配合循环使用,退出循环。(跳出循环必用)

  • iterate:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。

[begin_label:] loopSQL逻辑
end loop [end_label]
-- label有如下几种:
leave label; -- 退出指定标记的循环体
iterate label -- 直接进入下一次循环

2.练习

了解如何跳出循环、了解如何跳过当前循环进入下一次循环

(1)了解如何跳出循环leave

-- 1.计算从1累加到n的值,n为传入的参数值
create procedure p3(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;

(2)了解如何跳过当前循环进入下一次循环(iterate)

-- 2.计算从1到n之间的偶数累加的值,n为传入的参数值
create procedure p4(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;

四、游标

(1)基本说明

游标(cursor)是用来存储查询结果集数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明openfetchclose

游标需要声明在普通变量之后,否则会报错

-- 声明游标
declare 游标名称 cursor for 查询语句;
-- 打开游标
open 游标名称;
-- 获取游标记录
fetch 游标名称 into 变量[,变量...];
-- 关闭游标
close 游标名称;

(2)案例

根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户的姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。

-- 逻辑
-- 1.声明游标,存储查询结果集
-- 2.准备:创建表结构
-- 3.开启游标(open)
-- 4.获取游标中的记录(fetch)
-- 5.插入数据到新表中
-- 6.关闭游标(close)
create procedure p6(in max_age int)
begin-- 声明变量接收数据declare uname varchar(50) default null;declare uprofession varchar(50) default null;-- 1.声明游标,存储查询结果集declare u_cursor cursor for select name,profession from tb_user where age<max_age;-- 2.准备:创建表结构drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(50),profession varchar(50));-- 3.开启游标open u_cursor;while true do-- 4.获取游标中的记录fetch u_cursor into uname,uprofession;-- 5.插入数据到新表insert into tb_user_pro(name,age) values (uname,uage);end while;-- 6.关闭游标close u_cursor;
end;

以上可以很容易看出,while的条件是true,一直为真,会导致fetch取到空数据从而报错,为了解决这个问题,我们有了条件处理程序;

-- 定义条件处理程序
declare exit handler for SQLSTATE '02000' close u_cursor; 
-- exit放入while中即可

五、条件处理程序

条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。

declare handler_action handler for conditon_value [,conditon_value]... satement;handler_acion:continue -- 继续执行当前程序exit -- 终止执行当前程序
conditon_value:sqlstate 状态码 -- 如:sqlstate 2000sqlwarning 	-- 所有01开头的sqlstate代码的简写not found		-- 所有02开头的sqlstate代码的简写sqlexception	-- 所有没有被sqlwarning和notfound捕获的sqlstate代码的简写
#状态码为02000
declare exit handler for SQLSTATE '02000' close u_cursor;#当状态为02开头语句时
declare exit handler for not found colse u_cursor;

六、存储函数

(1)基本说明

存储函数是有返回值的存储过程,存储函数的参数只能是in类型的。

能够使用存储函数的地方都可以用存储过程替代

create function 存储函数名称([参数列表])
returns  返回类型
[characteristic...] -- 特性名称
begin-- SQL语句return...;
end;-- characteristic说明:
deterministic  -- 相同输入参数总是产生相同的结果
not sql		-- 不包含sql语句
reads sql data	-- 包含读取数据的语句,但不包含写入数据的语句

如果不加特性characteristic,会报错,如下图:

在这里插入图片描述
(2)案例

-- 计算从1累加到n的值,n为传入的参数值
create function fun1(n int)
returns int deterministic
begindeclare total int default 0;while n>0 doset total := total+n;set n := n-1;end while;return total;end;select fun1(100);

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

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

相关文章

HarmonyOS布局实战:用声明式UI构建自适应电商卡片

首先诚邀大家参加学习鸿蒙拿好礼活动&#xff0c;即日起&#xff0c;只要加入班级考取华为开发者基础/高级证书&#xff0c;并发表一篇技术文章&#xff0c;就有机会获得官方发放的精美礼品&#xff0c;数量有限&#xff0c;先到先得。冷老师的班级链接如下&#xff1a;​华为开…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3

日语学习-日语知识点小记-构建基础-JLPT-N3阶段&#xff08;&#xff12;1&#xff09;&#xff1a;文法单词第7回3 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰2、知识点&#xff11;ー 。。。と。。。なる&#xff12;ーVて欲しい ・ …

Baumer高防护相机如何通过Tiny-YOLO单类模型实现人体跌倒检测与跟踪(C#代码UI界面版)

《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号项目名称项目名称11.工业相机 YOLOv8 实现人物检测识别&#xff1a;&#xff08;C#代码&#xff0c;UI界面版&#xff09;2.工业相机 YOLOv8 实现PCB的缺陷检测&#xff1a;&#xff08;C#代码&#xff0…

从源码看浏览器弹窗消息机制:SetDefaultView 的创建、消息转发与本地/在线页通用实践

引言在现代浏览器的开发中&#xff0c;前端页面和 C 内核之间的通信是一项核心功能。无论是本地设置页&#xff08;chrome:// 内置 H5&#xff09;还是在线活动页&#xff0c;前端都可能需要调用浏览器底层 API&#xff0c;实现诸如“设置默认浏览器”、“更改壁纸”、“读取用…

对比视频处理单元(VPU)、图形处理器(GPU)与中央处理器(CPU)

如今选择互联网点播流媒体与直播视频的用户数量已远超传统广播电视&#xff0c;这一转变催生了对高性能媒体转码与OTT流媒体功能专用技术的需求。 我们最新推出的Accelerated Compute云计算解决方案&#xff0c;首次通过NETINT Quadra视频处理单元&#xff08;VPU&#xff09;…

vue3写一个简单的时间轴组件

插件版本&#xff1a;"element-plus": "^2.3.12""vue": "^3.0.0"代码示例&#xff1a;样式文件style.less&#xff1a;改变el-tooltip样式&#xff0c;可以复制代码到公共样式文件.el-popper.o-el-tooltip-popper-class {max-width: 3…

Linex系统网络管理(二)

二、网络连接查看1. netstat作用查看本地服务的网络监听状态查看客户端连接到本地服务的连接状态语法&#xff1a;netstat 选项 &#xff08;-anptu&#xff09;选项作用-n&#xff0c; --numeric显示数字形式地址而不是去解析主机、端口或用户名-a, --all显示所有的监听或连接…

Unity MQTT通讯

首先明确概念&#xff0c;什么是MQTT&#xff1f; MQTT是一种轻量级、基于发布 / 订阅&#xff08;Publish/Subscribe&#xff09;模式的物联网&#xff08;IoT&#xff09;通信协议&#xff0c;在带宽有限、网络不稳定的环境下&#xff0c;实现低功耗、低延迟的设备间通信&am…

JavaSE:类和对象2

一、封装封装的概念面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说 就是套壳屏蔽细节。例如手机&#xff0c;你看不到任何的内部实现细节&#xff0c;只留下一些公开的接口给你使用&am…

RandAR训练自己的数据集

论文题目:RandAR: Decoder-only Autoregressive Visual Generation in Random Orders(随机顺序下仅解码器的自回归视觉生成) 会议:CVPR2025 摘要:我们介绍了RandAR,一种仅解码器的视觉自回归(AR)模型,能够以任意令牌顺序生成图像。与之前依赖于预定义生成顺序的纯解码器…

基于PHP服装租赁管理系统/基于php的服装管理系统的设计与实现

基于PHP服装租赁管理系统/基于php的服装管理系统的设计与实现

高并发内存池(12)-ThreadCache回收内存

高并发内存池&#xff08;12&#xff09;-ThreadCache回收内存 代码如下&#xff1a; // 释放对象时&#xff0c;链表过长时&#xff0c;回收内存回到中心缓存 void ThreadCache::ListTooLong(FreeList& list, size_t size) {void* start nullptr;void* end nullptr;list…

读大语言模型09超级智能

1. 超级智能1.1. 如果人工智能超越人类智能&#xff0c;可能会成为人类存在的一个重大威胁1.1.1. 对超级人工智能潜在危险最为担忧的群体中&#xff0c;恰恰包括那些否认大语言模型具备真正智能的人1.2. 计算机科学已经成为所有科学领域中不可或缺的重要组成部1.3. GPT具备编写…

阿里云拉取dockers镜像

假如你已经在云服务器上安装了docker需要配置下docker镜像加速代理就行了找到自己的加速网址&#xff1a;然后在云服务器上&#xff0c;修改docker 配置文件&#xff0c;vi /etc/docker/daemon.json没有这个文件的话&#xff0c;需要创建一个。{"default-address-pools&qu…

python自学笔记14 NumPy 线性代数

在Numpy库中有专门的linalg 模块用来做线性代数相关的运算。 本文中线性代数的一般概念不会解释 拆解矩阵 鸢尾花数据矩阵结构如下&#xff08;150 4&#xff09;&#xff1a;取其中的行向量和列向量&#xff1a; # 导入包 import numpy as np from sklearn.datasets import l…

ubuntu20搭建MQTT

sudo apt update sudo apt install mosquitto mosquitto-clients sudo mosquitto_passwd -c /etc/mosquitto/passwd myuser sudo nano /etc/mosquitto/mosquitto.conf# 允许匿名用户连接&#xff08;默认为 true&#xff0c;我们先关闭它&#xff09; allow_anonymous false# 指…

云服务器的主要用途都有哪些?

企业可以利用云服务器构建官方网站&#xff0c;企业官网需要稳定的运行环境来展示产品、服务、公司动态等信息&#xff0c;云服务器提供的高可用性和可扩展性&#xff0c;能保障大量用户同时访问时网站的稳定运行。移动应用的后端服务可以部署在云服务器上&#xff0c;如社交类…

IntelliJ IDEA Debug 模式功能指南

文章目录前言&#x1f4a1; 1. 断点类型与设置&#x1f680; 2. 启动 Debug 模式⚙️ 3. 调试控制按钮详解&#x1f440; 4. 查看与监控变量&#x1f9f0; 5. 高级调试技巧&#x1f48e; 总结前言 作为一名 Java 开发者&#xff0c;熟练掌握调试技巧是提高开发效率的关键。Int…

在pycharmIDE中如何快速掌握一个新模块的使用方法

一、文档使用悬停文档&#xff1a;鼠标悬停在模块/函数上显示文档摘要 (⭐最常用)快速文档&#xff1a;选中标识符按 CtrlQ (Windows/Linux) 或 F1 (Mac)跳转定义&#xff1a;Ctrl左键单击 直接跳转到源码定义处 (⭐最权威)参数提示&#xff1a;输入函数名时自动显示参数列表&a…

win11自定义停止更新方法

一、打开运行窗口&#xff08;winr&#xff09;输入regedit打开注册表编辑器。按照如下路径寻找。计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings二、在Settings页面下右击——>新建——>DWORD(32位)值(D)&#xff0c;并重命名为粉色框中的名字…