MySQL学习(17):SQL编程:存储过程

news2024/9/20 22:56:19

1.什么是存储过程

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

存储过程的特点:

(1)封装,复用

(2)可以接收参数,可以返回数据

2.存储过程语法

2.1创建

create procedure 存储过程名([参数列表])
#小括号必须要有,参数列表可以没有
begin
SQL语句
end;

2.2调用

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

2.3查询

(1)查询指定数据库的存储过程及状态信息

select * from information_schema.routines where routine_schema='数据库名';

(2)查询某个存储过程的定义

show create procedure 存储过程名;

查询结果出现的root是创建存储过程的用户

2.4删除

drop procedure 存储过程名;

2.5结束符号问题

在存储过程的SQL语句部分中,需要分号切分语句,而分号是mysql识别一条命令完结的标识,所以会造成使用分号后,SQL语句直接执行,无法创建存储过程。

要解决此问题,可以通过delimiter命令更改结束符,来规避此问题:

delimiter $$
#属于这条命令后,mysql所有语句的结束符就由分号变为$$了
#$$不是固定的,可以自行设置结束符

使用实例如下图:

创建完存储过程后,还可以再用delimiter命令把结束标志改回分号

3.存储过程变量

3.1系统变量

系统变量是mysql服务器提供的,分为全局变量(global)、会话变量(session)

(1)查看系统变量

show [global] variables;
#查看所有变量
#不写global是检索当前会话的变量,写global是检索mysql全局的变量

show [global] variables like '匹配内容';
#通过like模糊匹配查找变量,_匹配单字符,%匹配多字符

select @@[global] 系统变量名;
#查看指定变量

(2)设置系统变量

set [global] 系统变量名=值;
或
set @@[global]系统变量名=值;

变量值设置完后(无论是全局还是会话),只要重启数据库,系统变量名就都会恢复成默认值。如果想永久更改,需要在配置文件/etc/my.cnf中配置

3.2用户变量

用户可以自定义变量,不需提前声明

#赋值语句
set @变量名=值;
或
select @变量名=值;

select 字段名 into @变量名 from 表名;
#直接把表内字段的数据作为变量的值

select @变量名;
#查看变量的值

用户变量的使用只限于当前会话

3.3局部变量

局部变量需要declare声明,其范围是在一个存储过程的begin到end之间

(1)声明:

declare 变量名 变量类型[default 默认值];
#在声明的时候可以直接设置一个默认值
#变量类型就是int、char、varchar等等

(2)赋值:

跟用户变量的赋值方式相同

#赋值语句
set @变量名=值;
或
select @变量名=值;

select 字段名 into @变量名 from 表名;
#直接把表内字段的数据作为变量的值

4.存储过程参数与流程控制语句

4.1参数

存储过程的参数是在创建时设置的,作为输入、输出的对象使用。

存储过程的参数有以下3种:

使用方法如下:

(1)实例1

调用及显示方法如下:

*@result是一个未经声明的用户变量,只是用来接收存储过程结果的

图中灰色字段是软件工具自动提示出来的,不需要敲

(2)实例2

该例中,需要设置一个同时负责传入数据与传出数据的用户变量@score

4.2if else语句

if判断是在begin与end间使用

条件1成立,执行第一个then后的语句,否则判断条件2;条件2成立,执行第二个then后的语句,否则判断条件3......

end if是固定的结尾标识

4.3case语句

(1)语法一

case 值
when 值1 then 语句1
when 值2 then 语句2
[else 语句3]
end else;
#case后的值是值1就执行语句1,是值2就执行语句2

(2)语法二

case
when 条件表达式1 then 语句1
when 条件表达式2 then 语句2
[else 语句3]
end else;
#条件表达式1为true就执行语句1,条件表达式2为true就执行语句2,否则执行语句3

4.4while循环语句

实例如下:

4.5repeat循环语句

与while语句的区别是:while是符合条件才进行循环,repeat是满足条件才跳出循环

使用repeat写上面的while实例如下:

4.6loop循环语句

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

一个普通的loop循环如下:

[自定义开始标志:]loop
SQL语句
end loop[自定义结束标志];
#开始标志后的冒号不能少

loop循环本身是没有退出条件,需要自行添加退出语句:

(1)leave:配合循环使用,退出循环。

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

使用实例如下(还是前例):

4.7游标cursor

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

游标的使用包括游标游标(CURSOR)的声明、OPEN、FETCH和 CLOSE,其语法如下:

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

OPEN 游标名称;
#打开游标

FETCH 游标名称 INTO 变量,变量...;
#获取游标记录

CLOSE 游标名称;
#关闭游标

使用实例如下:

上述程序虽然可以顺利执行,但存在一个while语句死循环的问题,要解决这个问题,可以使用handler(条件处理程序)

4.8条件处理程序handler

handler可以用来定义在流程执行中遇到问题时的处理步骤。分为继续、停止2种。其语法如下:

declare continue handler for 状态1,状态2... SQL语句;
#当出现语句中的状态时,继续执行当前程序

declare exit handler for 状态1,状态2... SQL语句;
#当出现语句中的状态时,停止执行当前程序

语句中的状态有4种:

(1)sqlstate 状态码

状态码比如02000,代表没得到数据

(2)sqlwaring:所有以01开头的状态码

(3)not found:所有以02开头的状态码

(4)sqlexception:01、02开头以外的其他状态码

使用handler解决前述while语句死循环的方法如下:

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

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

相关文章

查看Keepalived 的 VIP 有效、高可用、单播和组播

VIP(虚拟 IP) VRRP(Virtual Router Redundancy Protocol) 验证 VIP 是否有效 1、没有部署之前,PING要设置的VIP地址,不通 ping 10.119.108.602、部署之后,所有节点进行PING要设置的VIP地址&a…

代码实现yolov3主干网络,可以直接运行

1. 主干网head版本1 import torch from torch import nn import torch.nn.functional as F class ConvBnLeakRelu(nn.Module):def __init__(self,in_ch,out_ch,k3,s1):super().__init__()self.layernn.Sequential(nn.Conv2d(in_ch, out_ch, kernel_sizek, paddingk // 2,stride…

H264记录和翻译

官方中文文档: 📎H.264_ITU官方中文版.pdf 官方下载地址: https://www.itu.int/rec/T-REC-H.264/en JM源码: https://iphome.hhi.de/suehring/tml/download/ 博客参考学习:H.264官方软件JM源代码简单分析-解码器ld…

真免费!10 款必备的语言类 AI 大模型

好多小伙伴反映,买了好多AI工具,但并不好用,今天我给你推荐10个好用且免费的语言类AI大模型。 以后就别去花冤枉钱了。 排名不分先后。 各有所长,大家收藏自行去测试甄选适合自己的AI工具。 — 1 — 文心一言 文心一言是百度…

Android12 显示框架之getSurface

目录:Android显示终极宝典 在上篇文章中,我们讲到了应用通过createSurface()在surfaceflinger内生成了一个Layer,并且获取到了该Layer的Handle且将其和其他信息保存到了SurfaceControl。应用拿到了这个SurfaceControl,那么接下来…

uniapp APP端使用web-view,跳转回APP指定页面

URL Scheme 首先我一开始想到的是UrlSchemes,发现UrlSchemes不好实现就转为下面的方法 URL Scheme 是一种用于在移动应用程序中打开另一个应用程序或执行特定操作的机制。通过使用 URL Scheme,应用程序可以将用户重定向到其他应用程序或执行特定的任务…

大模型在自动驾驶领域是怎么应用的?最新综述一览

写在前面 大语言模型(LLMs)是在海量文本语料库上训练的人工智能模型,具备卓越的语言理解和生成能力,正在改变自动驾驶(AD)领域。随着自动驾驶系统从基于规则和优化的方法向基于学习的技术(如深…

关于企微群聊天工具功能的开发---PHP+JS+CSS+layui (手把手教学)

文章目录 前言准备工作PHP代码示例前端代码示例 主要是js踩的小坑&笔记最终达成的效果总结 前言 公司要求开发企微群聊天工具。首先一个客户一个群,其余群成员都是公司销售、设计师、工长、售后等人员。要求开发一个群聊天工具,工长点击进来以后就可…

selenium自动化代码报错“NoSuchElementException”——解决方案详解

假设自动化代码报错“NoSuchElementException”: 第一步:在报错的代码前,添加Thread.sleep(秒),设置的时间长一点。 第二步: 执行自动化,在自动化打开的页面里,打开前端开发者工具&#xff0c…

二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库

一、目的 安装OceanBase后,启动obd web,需要在OBD页面上部署OceanBase数据库 二、参考文档 http://t.csdnimg.cn/Qeedq 三、实施步骤 1 在obadmin用户下,启动obd服务,登录页面访问 [obadminhurys23 oceanbase]$ obd web 2 登…

AIGC重塑设施农业:让农事操作更智能,生产效率更高

设施农业是现代农业的重要组成部分,随着人工智能等前沿技术的快速发展,这个领域迎来了新的变革机遇。尤其是大语言模型(Large Language Model,LLM)技术的崛起,其强大的语言理解和知识汇聚能力,为设施农业智能化发展带来了新的想象空间。本文将深入探讨大模型技术在设施农业生产…

寝室恶性负载识别模块原理和功能

石家庄光大远通电气有限公司寝室恶性负载识别智能模块导轨式安装,采用局域网或者4G集中控制,在宿舍多回路中可以单独设置控制参数达到精细化管理。 原理:‌ 电压电流检测法:‌通过检测电路中的电压和电流,‌计算电路中…

网段划分(为什么+分类划分,CIDR),ip地址组成,路由器介绍,广播地址,DHCP,NAT技术,ipv6,如何申请网络

目录 网段划分 引入 ip地址的组成 同一网段内 不同的网段 路由器 ip地址的分配 DHCP技术 分类划分法 分组 弊端 CIDR(无类域间路由) 变长子网掩码 数据包转发 子网地址范围计算 两个特殊的ip地址 网络号 广播地址 作用 其他解决方…

学习Java的日子 Day62 Filter过滤器

Day62 Filter过滤器 简介 Filter:过滤器,通过Filter可以拦截访问web资源的请求与响应操作。 Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器。他可以拦…

数据结构——二叉树_堆

目录 一、堆的概念 二、堆的结构 三、性质 (1)堆的性质 (2)二叉树的性质 四、堆的实现 (1)头文件——Heap.h (2)源文件——Heap.c 1.堆的初始化 2.堆的销毁 3.向上调整算法 4.堆的插入 4.判断堆…

​人工智能薪酬排行榜:2024年哪些岗位最吃香?

近日,智联招聘发布了2024年二季度《中国企业招聘薪酬报告》。报告显示,人工智能行业平均薪酬为13594元/月,位居行业榜首。 同时,在“2024年二季度企业招聘薪酬TOP20职业”中,人工智能工程师以平均月薪22003元排名第一。…

口碑最好的麦克风品牌有哪些,无线领夹麦克风十大品牌推荐

​在内容丰富的自媒体世界里,每一个细节都可能是吸引观众的关键,尤其是音质。面对这么多的无线领夹麦克风,到底哪款更值得入手呢?我试用并挑选了几款性价比高的无线领夹麦克风,它们能够为各类视频制作提供令人印象深刻…

7.5寸电子日历

7.5英寸无线智能纸质显示屏幕办公名牌电子墨水数字显示ESL标签仓库使用

ONVIF 摄像头视频流获取 - 步骤与Python例程

1.基本流程 加入组播udp接口,查询子网内在线的ONVIF摄像头的设备地址: 设备地址形如:http://192.168.0.6/onvif/device_service 这一步,参看上一篇发文:[ONVIF系列 - 01] 简介 - 设备发现 - 相关工具-CSDN博客查询med…